1.遞歸
遞歸算法是一種直接或間接調用自身算法的過程。
每個遞歸函數都有兩部分:基線 條件(base case)和遞歸條件(recursive case)。
- 遞歸條件指的是函數調用自己的條件
- 基線條件則指的是函數不再調用自己,函數的終止條件,避免形成無限循環 。
比如,如下打印數字的遞歸函數:
2.調用棧
調用棧(call stack)也是一個很重要的數據結構。所有函數調用都進入調用棧,使用遞歸必須理解這個概念。
調用棧是的原則是先進后出,棧有兩種操作:壓入和彈出。。
比如,下面的函數
首先調用greet("maggie"),計算機將首先為該函數調用分配一塊內存。並將涉及的所有變量存入內存。
再調用greet2("maggie")。同樣,計算機也為這個函數調用分配一塊內存。 計算機使用一個棧來表示這些內存塊,其中第二個內存塊位於第一個內存塊上面。
然后greet2("maggie")執行完畢,函數調用返回。此時,棧頂的內存塊 greet2 被彈出。
現在返回到了函數greet。當你調用函數greet2 時,函數greet只執行了一部分。調用另一個函數時,當前函數暫停 並處於未完成狀態。該函數的所有變量的值都還在內存中。執行完函數greet2后,回到函數 greet,並從離開的地方開始接着往下執行。
這個棧用於 存儲多個函數的變量,被稱為調用棧。
3.遞歸調用棧示例
比如階乘n!的遞歸函數

以3!也就是fact(3)函數調用棧如下: 先從下到上堆棧,然后從基線條件往下出棧。

4.遞歸調用棧的缺點
遞歸調用棧雖然很方便,如果棧很高,就意味着計算機存儲了大量函數調用的信息,會占用大量內存。