遞歸就是直接或間接的調用自身的函數。下面是用遞歸方法求fibonacci數列#includestido.hlong fib(int n){if(n==1||n==2)return 1;return fib(n-1)+fib(n-2);} main(){int n;scanf("%d",n);printf("%ld\n",fib(n));return 0;} 說白了就是函數的自身嵌套調用 函數在定義的時候可以調用其他函數,包括自身。 但是一定要有終止條件 否則會進入死循環。上面的終止條件是n==1||n==2
創新互聯專注于臨西網站建設服務及定制,我們擁有豐富的企業做網站經驗。 熱誠為您提供臨西營銷型網站建設,臨西網站制作、臨西網頁設計、臨西網站官網定制、微信平臺小程序開發服務,打造臨西網絡公司原創品牌,更為您提供臨西網站排名全網營銷落地服務。
...
從匯編的角度來說,函數
返回值
,其實就是函數返回后,cpu中eax的值。在C語言等語方中,在函數中寫了返回語句,那么函數在返回時,就會對eax作最后賦值。
int
find(int
a,int
b)
{
if(b=0)
return
100;
else
find(--a,--b);/這里為什么不用返回值?/
}
//為什么不用返回值呢,因為此程序進行遞歸后,在最初返回時,eax的值被賦值為100,而之后的回溯過程中,程序并沒有修改eax的值,所以到最后,返回值還是100。
這種寫法是會出問題的。應寫成。
int
find(int
a,int
b)
{
if(b=0)
return
100;
else
return
find(--a,--b);
}
為什么了修改之后就出錯呢,如以上所說,這很好理解,因為程序最后調用了printf()。eax中的值是printf()的返回值。若把他當成find()的返回值自然是出錯了。
以下是執行順序,沒有縮進的表示在f(0)中執行,縮進2個空格的是在f(1)中執行,依次類推,else 中的for循環在 f(1), f(2)中經常會因為if(!used[i])而跳過,只要注意到這一點,就很清楚了!
希望能幫到你..
首先 dep = 0 時,調用 f(0)
執行 else 中的 for 循環(i= 1)
used[1] = true;
a[0] = 1;
進入 dep = 1
執行 else 中的 for 循環(i= 2)
used[2] = true;
a[1] = 2;
進入 dep = 2
執行 else 中的 for 循環,(i=3)
used[3] = true;
a[2] = 3;
進入 dep = 3:
dep=n,執行 if 中的 for 循環開始打印,第一次打印哦!!!!
打印結果 1, 2, 3
返回到dep = 2
used[3] = false;
由于dep=2 的 i = 3,循環結束了,返回到dep = 1
used[2] = false;
dep=1的循環 (i = 3)
used[3] = true;
a[1] = 3;
進入dep=2(循環 i = 2)
used[2] = true;
進入dep=3(打印)
打印結果1, 3, 2
返回到dep = 2
used[2] = false;
返回到 dep = 1
used[3] = false;
返回到dep = 0
used[1] = false;
執行dep=1 中 else 的 for 循環,第二次循環 i= 2
...
返回機制應該在前,弄明白了返回機制遞歸才好理解
在調用一個函數的時候,編譯器先把函數的參數從右自左壓入棧中,然后用call指令跳至子過程地址,在跳之前會把當前代碼所在的【段:偏移】地址壓棧,當子過程執行完,會調用ret指令返回,ret指令和call相反當好是把棧中的【段:偏移】還原回寄存器(cs和ip),ret也就是C++的return關鍵字(當然,C++因為有重載機制,編譯器會在壓棧之前給所有的函數作簽名改編,這是另一個話題),以上是返回的原理。
弄明白了返回,遞歸就好理解了,假設從主函數調用一個子函數,這個子函數每次都對參數進行一些處理并遞歸,那么進入函數體后棧的狀態是:參數、返回地址;那么在函數中又調用自己,棧就變成了:參數、返回地址、參數、返回地址;當滿足了遞歸的退出條件時,ret一次,回到前一次自調用的地址,從這個地址開始,處理參數讓棧頂停在返回地址處,然后ret......如此往復,直到回到調用子函數的函數體,以上的例子類似于:
void fun(int p)
{
if(p=1)//遞歸出口
return;
p--;
fun(p);
//這一步編譯器實際上會pop ecx然后ret
return;
}
分享文章:C語言遞歸函數回溯 c語言回溯算法
當前網址:http://vcdvsql.cn/article46/hehghg.html
成都網站建設公司_創新互聯,為您提供小程序開發、品牌網站建設、網頁設計公司、網站排名、搜索引擎優化、App設計
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯