遞迴函式其實不難理解

2021-07-07 09:14:38 字數 807 閱讀 1169

遞迴函式就是直接或者間接的呼叫自己本身。比如:

#include#includevoid fun()

int main()

但是這個程式執行起來後會怎樣呢?

這就是因為剛剛使用的遞迴不能停止呼叫自己本身,每次在呼叫的時候在棧上都要開闢空間,作為函式執行時堆疊所使用,一直呼叫自然會導致棧溢位!

所以使用遞迴函式的時候必須注意來兩個問題:

1.存在限制條件(也就是在遞迴函式中必須設定邊界條件)用來控制遞迴的結束

2.每次遞迴呼叫之後要越來越接近這個限制條件(逼近這個邊界)

我們來看乙個函式,它的功能是將乙個數轉換稱為相應的字元輸出,比如輸 1234,應該轉換成字元"1234"。

#include#includevoid int_to_as(int n)

printf("%c", n % 10 + '0');

}int main()

結果是:

但是在執行時的過程是怎麼樣的呢?

如上圖所畫的,首先main函式呼叫int_to_as()函式,此時n=1234;限制條件滿足,則呼叫本身,如圖所示的,直到n=1的時候,限制條件起到作用不再呼叫本身,而是執行printf語句,完了之後最後一次函式呼叫結束,此時它將帶著它的返回值返回到所呼叫它的地方的下一條語句,一次進行,遞迴就完成了這個任務。

函式在呼叫的時候都會在堆疊上開闢執行時堆疊,每次呼叫都會對上次的呼叫進行壓棧,到執行到最後一次時,就會進行依次出棧,銷毀剛剛所開闢的空間。

有關遞迴函式的使用在另一篇部落格中也有介紹:

遞迴函式理解

package algorithms.sort public class middlesplitbyrecursion public static void middlesplitbytworecursion int a,int lo,int hi public static void main s...

遞迴函式理解

遞迴需要關注,每次遞迴達到的目的,包括影響了哪些全域性值,或者改變什麼全域性狀態 另外是輸入條件和邊界結束條件,輸入條件保證遞迴的輸入環境是否一致 結束條件,表明什麼時候結束,避免無限遞迴。最後是遞迴在函式中的位置,遞迴在函式開始,中間,末尾 遞迴函式在函式中不同的位置,影響點 1.函式前面部分對遞...

演算法 如何理解遞迴,寫好遞迴函式

不是每個程式設計師天生對遞迴理解深刻,剛入大一時候,當別人寫出第乙個求最大公約數的遞迴函式時,對其多麼的驚嘆,竟然可以不用迴圈,竟然 可以這麼簡潔,確實遞迴在大多數情況下實現時候 很短,大部分人也知道遞迴,也能基本看懂遞迴,可是卻經常不知道怎麼寫,或者寫出來的遞迴經常死迴圈,寫演算法往往也是學的是套...