演算法分析與設計 遞迴與尾遞迴

2021-10-10 22:13:32 字數 1238 閱讀 9426

什麼是遞迴?

遞迴最恰當的比喻,就是查詞典。我們使用的詞典,本身就是遞迴,為了解釋乙個詞,需要使用更多的詞。當你查乙個詞,發現這個詞的解釋中某個詞仍然不懂,於是你開始查這第二個詞,可惜,第二個詞裡仍然有不懂的詞,於是查第三個詞,這樣查下去,直到有乙個詞的解釋是你完全能看懂的,那麼遞迴走到了盡頭,然後你開始後退,逐個明白之前查過的每乙個詞,最終,你明白了最開始那個詞的意思。

接下來,我們從遞迴的經典示例來理解。

斐波那契數列(fibonacci sequence):

long fibonacci(int n)
從示例中可以看出,遞迴的特點

自身呼叫:原問題可以分解為子問題,子問題和原問題的求解方法是一致的,即都是呼叫自身的同乙個函式。

終止條件:遞迴必須有乙個終止的條件,即不能無限迴圈地呼叫本身,否則,程式將永遠執行下去,直到程式缺少記憶體或者棧空間。

在遞迴呼叫的過程當中系統為每一層的返回點、區域性量等開闢了棧來儲存,因此遞迴次數過多容易造成棧溢位。

什麼是尾遞迴?

尾遞迴是指遞迴函式在呼叫自身後直接傳回其值,而不對其再加運算。也就是說,函式呼叫出現在呼叫者函式的尾部, 因為是尾部, 所以根本沒有必要去儲存任何區域性變數。尾遞迴就是把當前的運算結果(或路徑)放在引數裡傳給下層函式。

尾遞迴是極其重要的,不用尾遞迴,函式的堆疊耗用難以估量,需要儲存很多中間函式的堆疊。

再看採用尾遞迴實現斐波那契數列(fibonacci sequence)​​​​​​​:

long fibonacci(int n,long ret1,long ret2)
尾遞迴不需要向上返回了,但是需要引入另外的兩個空間來儲存當前的結果。(如示例中的 ret1 和 ret2 )

遞迴與尾遞迴的比較

可以看出,尾遞迴的演算法效率比普通遞迴的效率更高,而且不需要為每一層的返回點、區域性量等開闢棧來儲存,只需引用兩個空間來儲存當前結果。

遞迴與尾遞迴

1 遞迴 關於遞迴的概念,我們都不陌生。簡單的來說遞迴就是乙個函式直接或間接地呼叫自身,是為直接或間接遞迴。一般來說,遞迴需要有邊界條件 遞迴前進段和遞迴返回段。當邊界條件不滿足時,遞迴前進 當邊界條件滿足時,遞迴返回。用遞迴需要注意以下兩點 1 遞迴就是在過程或函式裡呼叫自身。2 在使用遞迴策略時...

遞迴與尾遞迴

1 遞迴 簡單的來說遞迴就是乙個函式直接或間接地呼叫自身,是為直接或間接遞迴。一般來說,遞迴需要有邊界條件 遞迴前進段和遞迴返回段。當邊界條件不滿足時,遞迴前進 當邊界條件滿足時,遞迴返回。用遞迴需要注意以下兩點 1 遞迴就是在過程或函式裡呼叫自身。2 在使用遞迴策略時,必須有乙個明確的遞迴結束條件...

遞迴與尾遞迴

前言 今天上網看帖子的時候,看到關於尾遞迴的應用 大腦中感覺這個詞好像在 見過,但是又想不起來具體是怎麼回事。如是乎,在網上搜了一下,頓時豁然開朗,知道尾遞迴是怎麼回事了。下面就遞迴與尾遞迴進行總結,以方便日後在工作中使用。1 遞迴 關於遞迴的概念,我們都不陌生。簡單的來說遞迴就是乙個函式直接或間接...