遞歸函數c語言
❶ c語言關於函數的遞歸
你的遞歸程序是錯的,我轉來個對的,帶講解的,你看看。
語言函數的遞歸和調用
一、基本內容:
C語言中的函數可以遞歸調用,即:可以直接(簡單遞歸)或間接(間接遞歸)地自己調自己。
要點:
1、C語言函數可以遞歸調用。
2、可以通過直接或間接兩種方式調用。目前只討論直接遞歸調用。
二、遞歸條件
採用遞歸方法來解決問題,必須符合以下三個條件:
1、可以把要解決的問題轉化為一個新問題,而這個新的問題的解決方法仍與原來的解決方法相同,只是所處理的對象有規律地遞增或遞減。
說明:解決問題的方法相同,調用函數的參數每次不同(有規律的遞增或遞減),如果沒有規律也就不能適用遞歸調用。
2、可以應用這個轉化過程使問題得到解決。
說明:使用其他的辦法比較麻煩或很難解決,而使用遞歸的方法可以很好地解決問題。
3、必定要有一個明確的結束遞歸的條件。
說明:一定要能夠在適當的地方結束遞歸調用。不然可能導致系統崩潰。
三、遞歸實例
例:使用遞歸的方法求n!
當n>1時,求n!的問題可以轉化為n*(n-1)!的新問題。
比如n=5:
第一部分:5*4*3*2*1
n*(n-1)!
第二部分:4*3*2*1
(n-1)*(n-2)!
第三部分:3*2*1
(n-2)(n-3)!
第四部分:2*1
(n-3)(n-4)!
第五部分:1
(n-5)!
5-5=0,得到值1,結束遞歸。
源程序:
fac(int
n)
{int
t;
if(n==1)||(n==0)
return
1;
else
{
t=n*fac(n-1);
return
t;
}
}
main(
)
{int
m,y;
printf(「Enter
m:」);
scanf(「%d」,&m);
if(m<0)
printf(「Input
data
Error!\n」);
else
{y=fac(m);
printf(「\n%d!
=%d
\n」,m,y);
}
}
四、遞歸說明
1、當函數自己調用自己時,系統將自動把函數中當前的變數和形參暫時保留起來,在新一輪的調用過程中,系統為新調用的函數所用到的變數和形參開辟另外的存儲單元(內存空間)。每次調用函數所使用的變數在不同的內存空間。
2、遞歸調用的層次越多,同名變數的佔用的存儲單元也就越多。一定要記住,每次函數的調用,系統都會為該函數的變數開辟新的內存空間。
3、當本次調用的函數運行結束時,系統將釋放本次調用時所佔用的內存空間。程序的流程返回到上一層的調用點,同時取得當初進入該層時,函數中的變數和形參所佔用的內存空間的數據。
4、所有遞歸問題都可以用非遞歸的方法來解決,但對於一些比較復雜的遞歸問題用非遞歸的方法往往使程序變得十分復雜難以讀懂,而函數的遞歸調用在解決這類問題時能使程序簡潔明了有較好的可讀性;但由於遞歸調用過程中,系統要為每一層調用中的變數開辟內存空間、要記住每一層調用後的返回點、要增加許多額外的開銷,因此函數的遞歸調用通常會降低程序的運行效率。
五、程序流程
fac(int
n)
/*每次調用使用不同的參數*/
{
int
t;
/*每次調用都會為變數t開辟不同的內存空間*/
if(n==1)||(n==0)
/*當滿足這些條件返回1
*/
return
1;
else
{
t=n*fac(n-1);
/*每次程序運行到此處就會用n-1作為參數再調用一次本函數,此處是調用點*/
return
t;
/*只有在上一句調用的所有過程全部結束時才運行到此處。*/
}
}
❷ 講一下c語言中遞歸函數的使用方法
相當於循環,要有判斷條件,傳遞進去的參數要變化,滿足條件調用自身,不滿足條件就開始一層一層返回。簡單例子:
int
f(int
i){
int
sum=0;
if(i>0)
sum+=f(i-1);
return
sum;
}
main(){
int
a=10;
printf("%d",f(a));
}
❸ 用C語言編寫一個遞歸函數
int findf( int n ){
int a,b,c;
b = n % 2;
c = 0;
if ( n>4){
if (b==c){
a=findf( n-1 ) + findf( n-3 );
}
else{
a=findf( n-2 ) + findf( n-4 );
}
return a;
}
else if ( n < 0){
return -1;
}
else{
return 1;
}
}
❹ 講一下c語言中遞歸函數的使用方法
遞歸函數有三點要求:
1,遞歸的終止點,即遞歸函數的出口
2,不斷的遞歸調用自身
3,遞歸函數主體內容,即遞歸函數需要做的事情
ps:3一般可以放在2的前面或者後面,一般1放最前面。另外,2和3可以根據不同的需要合並,比如,有時候遞歸函數的主體就是返回調用下層函數所得到的結果。
具體例子如下:
voidfun(intn)
{
if(n<=0)return;//1這是遞歸的終點,即出口
fun(n-1);//2、遞歸函數自身的調用
cout<<n<<endl;//3遞歸函數的主體內容
}
2,3合並的情況
intfun(intn)
{
if(n<=0)return0;
returnfun(n-1)+fun(n-2);//23合並
}
❺ c語言怎麼用遞歸函數
首先是要這個求解的問題,適合用遞歸方法來進行求解。找到這個遞歸解法結束遞歸的條件。遞歸函數中,首先第一個語句就是如果滿足遞歸條件,就直接返回確定的值,否則返回使用遞歸方法求解的表達式。
❻ c語言遞歸函數
遞歸函數:
編程語言中,函數Func(Type a,……)直接或間接調用函數本身,則該函數稱為遞歸函數。遞歸函數不能定義為內聯函數。
在數學上,關於遞歸函數的定義如下:對於某一函數f(x),其定義域是集合A,那麼若對於A集合中的某一個值X0,其函數值f(x0)由f(f(x0))決定,那麼就稱f(x)為遞歸函數。
函數介紹:
在數理邏輯和計算機科學中,遞歸函數或μ-遞歸函數是一類從自然數到自然數的函數,它是在某種直覺意義上是"可計算的" 。事實上,在可計算性理論中證明了遞歸函數精確的是圖靈機的可計算函數。遞歸函數有關於原始遞歸函數,並且它們的歸納定義(見下)建造在原始遞歸函數之上。但是,不是所有遞歸函數都是原始遞歸函數 — 最著名的這種函數是阿克曼函數。
其他等價的函數類是λ-遞歸函數和馬爾可夫演算法可計算的函數。
例子:
//代碼1
void func()
{
//...
if(...)
func();
else
//...
}
條件:
一個含直接或間接調用本函數語句的函數被稱之為遞歸函數,在上面的例子中能夠看出,它必須滿足以下兩個條件:
1) 在每一次調用自己時,必須是(在某種意義上)更接近於解;
2) 必須有一個終止處理或計算的准則。
梵塔的遞歸函數:
//C
void hanoi(int n,char x,char y,char z)
{
if(n==1)
move(x,1,z);
else
{
hanoi(n-1,x,z,y);
move(x,n,z);
hanoi(n-1,y,x,z);
}
}
❼ c語言函數遞歸調用
我給你舉個簡單的例子你就明白了,你可以假設n=3
然後代入這個函數,a(3)=a(2)+5;而a(2)=a(1)+5;a(1)=1
所以最後就是a(3)=1+5+5=11…
同理你可以算出a(10)=1+5*9=46
滿意請採納
❽ 在C語言中什麼叫遞歸
遞歸:就是自己調自己,但是沒終止條件會死循環,所以你的遞歸代碼里有結束自調自的條件,這樣就創造了有限次的循環(代碼中你看不到for或foreach但是有循環發生)
❾ C語言 編寫遞歸函數
標個記號准備上傳對大神的源碼分析。好了,我分析了上樓大神的代碼實現,具體參考他的代碼,分享下。註:可以看看《演算法精解》Kyle Loudon著 或者《數據結構》主編 安訓國他們說的堆棧原理。
#include<stdio.h>
char*dg(char*instr,char*outstr,char*outstr2)
{
if(*instr==0)
{
*outstr=0;
returnoutstr2;
}
*(outstr+1)=*instr;
outstr=dg(instr+1,outstr+2,outstr2);
/*下兩句一直不執行,直到outstr=dg(instr+5,outstr+10,outstr2)返回後才執行,其後不斷執行後三句!*/
*outstr=*instr-32;
returnoutstr+2;
}
intmain()
{
charbuf[50];
dg("aybdx",buf,buf);
puts(buf);
return0;
}
❿ c語言遞歸函數
遞歸(recursion)就是子程序(或函數)直接調用自己或通過一系列調用語句間接調用自己,是一種描述問題和解決問題的基本方法。
遞歸通常用來解決結構自相似的問題。所謂結構自相似,是指構成原問題的子問題與原問題在結構上相似,可以用類似的方法解決。具體地,整個問題的解決,可以分為兩部分:第一部分是一些特殊情況,有直接的解法;第二部分與原問題相似,但比原問題的規模小。實際上,遞歸是把一個不能或不好解決的大問題轉化為一個或幾個小問題,再把這些小問題進一步分解成更小的問題,直至每個小問題都可以直接解決。因此,遞歸有兩個基本要素:
(1)邊界條件:確定遞歸到何時終止,也稱為遞歸出口。
(2)遞歸模式:大問題是如何分解為小問題的,也稱為遞歸體。遞歸函數只有具備了這兩個要素,才能在有限次計算後得出結果
漢諾塔問題:對漢諾塔問題的求解,可以通過以下3個步驟實現:
(1)將塔上的n-1個碟子藉助塔C先移到塔B上;
(2)把塔A上剩下的一個碟子移到塔C上;
(3)將n-1個碟子從塔B藉助塔A移到塔C上。
在遞歸函數中,調用函數和被調用函數是同一個函數,需要注意的是遞歸函數的調用層次,如果把調用遞歸函數的主函數稱為第0層,進入函數後,首次遞歸調用自身稱為第1層調用;從第i層遞歸調用自身稱為第i+1層。反之,退出第i+1層調用應該返回第i層。採用圖示方法描述遞歸函數的運行軌跡,從中可較直觀地了解到各調用層次及其執行情況,具體方法如下:
(1)寫出函數當前調用層執行的各語句,並用有向弧表示語句的執行次序;
(2)對函數的每個遞歸調用,寫出對應的函數調用,從調用處畫一條有向弧指向被調用函數入口,表示調用路線,從被調用函數末尾處畫一條有向弧指向調用語句的下面,表示返迴路線;
(3)在返迴路線上標出本層調用所得的函數值。n=3時漢諾塔演算法的運行軌跡如下圖所示,有向弧上的數字表示遞歸調用和返回的執行順序
三、遞歸函數的內部執行過程
一個遞歸函數的調用過程類似於多個函數的嵌套的調用,只不過調用函數和被調用函數是同一個函數。為了保證遞歸函數的正確執行,系統需設立一個工作棧。具體地說,遞歸調用的內部執行過程如下:
(1)運動開始時,首先為遞歸調用建立一個工作棧,其結構包括值參、局部變數和返回地址;
(2)每次執行遞歸調用之前,把遞歸函數的值參和局部變數的當前值以及調用後的返回地址壓棧;
(3)每次遞歸調用結束後,將棧頂元素出棧,使相應的值參和局部變數恢復為調用前的值,然後轉向返回地址指定的位置繼續執行。
上述漢諾塔演算法執行過程中,工作棧的變化如下圖所示,其中棧元素的結構為(返回地址,n值,A值,B值,C值),返回地址對應演算法中語句的行號,分圖的序號對應圖中遞歸調用和返回的序號
我可以幫助你,你先設置我最佳答案後,我網路Hii教你。