用遞歸法計算n!

創新互聯建站是專業的蚌山網站建設公司,蚌山接單;提供網站設計制作、做網站,網頁設計,網站設計,建網站,PHP網站建設等專業做網站服務;采用PHP框架,可快速的進行蚌山網站開發網頁制作和功能擴展;專業做搜索引擎喜愛的網站,專業的做網站團隊,希望更多企業前來合作!
用遞歸法計算n!可用下述公式表示:
n!=1 (n=0,1)
n×(n-1)! (n1)
按公式可編程如下:
long ff(int n)
{
long f;
if(n0) printf("n0,input error");
else if(n==0||n==1) f=1;
else f=ff(n-1)*n;
return(f);
}
main()
{
int n;
long y;
printf("\ninput a inteager number:\n");
scanf("%d",n);
y=ff(n);
printf("%d!=%ld",n,y);
}
程序中給出的函數ff是一個遞歸函數。主函數調用ff 后即進入函數ff執行,如果n0,n==0或n=1時都將結束函數的執行,否則就遞歸調用ff函數自身。由于每次遞歸調用的實參為n-1,即把n-1的值賦予形參n,最后當n-1的值為1時再作遞歸調用,形參n的值也為1,將使遞歸終止。然后可逐層退回。
下面我們再舉例說明該過程。設執行本程序時輸入為5,即求5!。在主函數中的調用語句即為y=ff(5),進入ff函數后,由于n=5,不等于0或1,故應執行f=ff(n-1)*n,即f=ff(5-1)*5。該語句對ff作遞歸調用即ff(4)。
進行四次遞歸調用后,ff函數形參取得的值變為1,故不再繼續遞歸調用而開始逐層返回主調函數。ff(1)的函數返回值為1,ff(2)的返回值為1*2=2,ff(3)的返回值為2*3=6,ff(4)的返回值為6*4=24,最后返回值ff(5)為24*5=120。
#include stdio.h
#include math.h
void fun2(int m)
{
int k=0,a[10];
for(int i=2;im;i++)
if(m%i==0)
a[k++]=i;
for(int i=0;ik;i++)
{
printf("%d",a[i]);
if(i!=k-1)
printf(",");
}
}
void fun1(int m)
{
if(m2)
printf("%d is a prime number",m);
for(int i=2;i*i=m;i++)
if(m%i==0)
fun2(m);
else
printf("%d is a prime number",m);
}
int main( )
{ int n;
scanf("%d",n);
fun1(n);
return 0;
}
遞歸具體用法其實就是讓你把一個問題分解成很多個類似的情況,雖然你要解決這個問題非常難,莫名其妙,要你想幾年,但是把他一直遞歸分解,就變成很好理解的單種情況,而你整個問題又是跟這個單種情況類似,把整個問題通過遞歸調用一層一層分解到最低級簡單的那種情況,就是你所需要理解的了。
一個函數在它的函數體內調用它自身稱為遞歸調用。這種函數稱為遞歸函數。C語言允許函數的遞歸調用。在遞歸調用中,主調函數又是被調函數。執行遞歸函數將反復調用其自身,每調用一次就進入新的一層。
(引自譚浩強的C語言書里)
用遞歸法計算n!可用下述公式表示:
n!=1 (n=0,1)
n×(n-1)! (n1)
具體如下long ff(int n)
{
long f;
if(n0) printf("n0,input error");
else if(n==0||n==1) f=1;
else f=ff(n-1)*n;
return(f);
}
main()
{
int n;
long y;
printf("\ninput a inteager number:\n");
scanf("%d",n);
y=ff(n);
printf("%d!=%ld",n,y);
}
較難題:一塊板上有三根針,A,B,C。A針上套有64個大小不等的圓盤,大的在下,小的在上。如圖5.4所示。要把這64個圓盤從A針移動C針上,每次只能移動一個圓盤,移動可以借助B針進行。但在任何時候,任何針上的圓盤都必須保持大盤在下,小盤在上。求移動的步驟。
具體如下move(int n,int x,int y,int z)
{
if(n==1)
printf("%c--%c\n",x,z);
else
{
move(n-1,x,z,y);
printf("%c--%c\n",x,z);
move(n-1,y,x,z);
}
}
main()
{
int h;
printf("\ninput number:\n");
scanf("%d",h);
printf("the step to moving %2d diskes:\n",h);
move(h,'a','b','c');
}
從程序中可以看出,move函數是一個遞歸函數,它有四個形參n,x,y,z。n表示圓盤數,x,y,z分別表示三根針。move 函數的功能是把x上的n個圓盤移動到z上。當n==1時,直接把x上的圓盤移至z上,輸出x→z。如n!=1則分為三步:遞歸調用move函數,把n-1個圓盤從x移到y;輸出x→z;遞歸調用move函數,把n-1個圓盤從y移到z。在遞歸調用過程中n=n-1,故n的值逐次遞減,最后n=1時,終止遞歸,逐層返回。當n=4 時程序運行的結果為:
#include?stdio.h
#include?stdlib.h
int?count=0;
int?fun(int?x,int?n)
{
count++;
if(n==2)
{
return?x*x;
}
else?if(n%2==0)
{
return?fun(x,n/2)*fun(x,n/2);
}
else?if(n%2==1)
{
return?fun(x,n-1)*x;
}
}
int?main(int?argc,?char?*argv[])?{
int?sum=0,x,n;
printf("請輸入x?n的值(兩數之間用空格間隔):");
scanf("%d?%d",x,n);
sum=fun(x,n);
printf("%d??遞歸調用了%d次",sum,count);
return?0;
}
新聞標題:c語言遞歸函數計算函數值 c++的遞歸函數
本文鏈接:http://www.yijiale78.com/article26/hihcjg.html
成都網站建設公司_創新互聯,為您提供網站策劃、域名注冊、ChatGPT、定制網站、全網營銷推廣、網站排名
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯