尾遞迴與斐波那契三種解法

2021-08-18 10:16:36 字數 1129 閱讀 1288

int fib(int n) 

else

return fib(n - 1) + fib(n - 2);

}

要求第n個斐波那契數,子問題就是求每乙個斐波那契數的前一項和前二項之和,典型的遞迴思想。

這個演算法的時間複雜度怎麼算呢?

遞迴的時間複雜度:遞迴次數*一次遞迴的基本語句執行次數

遞迴的空間複雜度:在棧空間最大的臨時變數個數

如果求f(5),畫出呼叫過程就是

f(5)

f(4)

f(3)

f(3)

f(2)

f(2)

f(1)

f(2)

f(1)

乙個樹狀結構,先從f5->f4->f3-f2->f1->f2左子樹就遞迴完了。每乙個結點都是一次遞迴,每乙個遞迴裡只有乙個基本語句,而結點書大約等與2^(n-2)常數忽略也就是2^n次遞迴呼叫,所以時間複雜度o(2^n).

空間複雜度由圖可以看出f5->f2之後遞迴f1,之後歸值給f3,這時f2和f1的空間已經**了,所以最大的空間占用也只是f5->f1, 即o(n)。

int fib(int n) 

return ret;

}

迴圈迭代的精髓是每次計算的結果參與下次的計算,這種解法也是最優的,時間o(n),空間o(1).

int fib(int n, int ppre, int pre) 

int main()

遞迴呼叫返回的結果總被直接返回,則稱為尾部遞迴。尾部遞迴的函式有助將演算法轉化成函式程式語言,而且從編譯器角度來說,亦容易優化成為普通迴圈。這是因為從電腦的基本面來說,所有的迴圈都是利用重複移跳到**的開頭來實現的。

尾遞迴的精髓就是吸取迴圈的精華——把每次計算的結果當作引數傳遞給下一次計算。

呼叫過程如圖,時間複雜度就是o(n),如果編譯器優化空間複雜度o(1).

斐波那契 尾遞迴

1 計算任意數n的階乘 5 5 4 3 2 1 8 8 7 6 5 4 3 2 1 遞迴函式通過兩個條件出發回的過程 1 當前函式徹底執行完畢的時候,觸發回的過程,回到上一層函式的呼叫處 2 當前函式遇到return 返回值的時,觸發回的過程,回到上一層函式的呼叫處 普通方法 n 5 total 1...

斐波那契數列的三種解法

寫乙個函式,輸入n,求斐波那契數列的第n項。斐波那契數列的定義如下 課本的上為了講解遞迴演算法,經常用這個例子。讓我們看一下它的實現 package algorithm public class fibonacci recursion public static void main string a...

斐波那契 尾遞迴,DP

先看斐波拉契遞迴的樸素版本 int fib1 int n 這段 的意思是 第n個數等於前兩個數之和。但 f 1 1,f 0 0,這兩個特殊值作為遞迴出口。優化 尾遞迴 int fib wei int n int a,int b intmain 這段 明顯可讀性比樸素版本低,但優點在於將時間複雜度從o...