斐波那契 尾遞迴,DP

2021-10-10 20:44:02 字數 990 閱讀 1176

先看斐波拉契遞迴的樸素版本:

int

fib1

(int n)

這段**的意思是:第n個數等於前兩個數之和。但 f(1) = 1, f(0) = 0,這兩個特殊值作為遞迴出口。

優化:

尾遞迴:

int

fib_wei

(int n ,

int a,

int b)

intmain()

這段**明顯可讀性比樸素版本低,但優點在於將時間複雜度從o(2n) 變成了o(n),利用尾遞迴的特性做了乙個自底向上的運算,相當於迭代。但是比迭代看起來更簡潔。

dp版本:

int

fib(

int n)

;for

(int i =

2; i <= n;

++i)

return arr[n &1]

;}};

這個解題思路是在leetcode上看到的一位大佬的解題,斐波拉契的迭代思路,就是典型的dp思路,其延申式為arr[n] = arr[n-1] + arr[n-2],和尾遞迴一樣,思路應該是自底向上,時間複雜度o(n)已經沒法優化,但是作者將空間複雜度優化為了o(1)。正整數為偶數和奇數,奇數和偶數與1相與就只有1,和,0兩個結果。

從變化上,從f(2) = f(1) + f(0), 由於10 & 01等於0,0應該被更新, f(3) = f(2) + f(1) , 這裡1應該被更新。總結:偶數更新,arr[0],奇數更新arr[1]。

啟示:要做運算的資料,可以以另一種形式儲存。(位運算)

以下是其解題鏈結

作者leetcode解題鏈結

斐波那契 尾遞迴

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

斐波那契數列求解 尾遞迴

1.普通遞迴 這裡觀察f 4 的遞迴樹代替f 10 的遞迴樹 後者比較大,畫不下 使用遞迴求解的時候複雜度為t n t n 1 t n 2 t n t n 1 t n 2 t n t n 1 t n 2 觀察遞迴樹,發現降速最快的是最右邊每次減2,因此n 2 frac 2n 層以上的部分肯定是滿二叉...

遞迴 斐波那契

題 若一頭小母牛,從出生起第四個年頭開始每年生一頭母牛,按此規律,第n年有多少頭母牛?具體分析 1 分析題目 從出生起第四個年頭開始每年生一頭母牛 時間 年 未成熟母牛 頭 成熟母牛 頭 母牛總數 頭 1 1 0 1 2 1 0 1 3 1 0 1 4 0 1 1 5 1 1 2 6 2 1 3 7...