有關遞迴和斐波那契數列

2021-10-01 04:39:11 字數 1193 閱讀 2759

求斐波那契數列第n項,最簡單的方法

intf(

int n)

但顯然這很低效,因為會重複計算很多次前面的值,比如算f(10),要得到f(9),和f(8),而求f(9)要求f(8) 和f(7),求f(8)要求f(7)和f(6),就重複計算了f(8)和f(7),越往後重複的越多,總複雜度為指數級,效率極低

我們可以將前面的計算結果存起來,避免重複計算

intf(

int n)

return arr[n -1]

;}

這樣效率雖高,但占用額外的空間,仔細想想,每次結果只與前兩次結果有關,可以優化優化

intf(

int n)

return ans;

}

這被稱為迭代,無論是在時間上還是在空間上都很高效。

運用上述思想,來看下經典的爬樓梯問題

題目描述

假設你正在爬樓梯。需要 n 階你才能到達樓頂

每次你可以爬 1 或 2 個台階。你有多少種不同的方法可以爬到樓頂呢?

輸入: 2

輸出: 2

解釋: 有兩種方法可以爬到樓頂。

1.1 階 +

1 階2.

2 階輸入: 3

輸出: 3

解釋: 有三種方法可以爬到樓頂。

4.1 階 +

1 階 +

1 階5.

1 階 +

2 階6.

2 階 +

1 階

法一

//方法一,記憶化遞迴

intans

(int i,

int n,

int arr)

intclimbstairs

(int n)

return

ans(

0,n,arr)

;}

法二

int

climbstairs

(int n)

法三

int

climbstairs

(int n)

return third;

}

斐波那契數列 遞迴和遞迴優化

斐波那契數列 經典數學問題之一 斐波那契數列,又稱 分割數列,指的是這樣乙個數列 1 1 2 3 5 8 13 21 想必看到這個數列大家很容易的就推算出來後面好幾項的值,那麼到底有什麼規律,簡單說,就是前兩項的和是第三項的值,也許你會想到的是迭代,也學你想到的是遞迴。簡單分析一下遞迴 int fi...

斐波那契數列 遞迴和遞迴優化

斐波那契數列,即兔子問題 演算法筆試題可能會出現 function fun n return fun n 1 fun n 2 效能問題 1,自身巢狀太深,可能會引起堆疊溢位 堆疊溢位 函式呼叫會使用棧來儲存臨時變數。每呼叫乙個函式,都會將臨時變數封裝為棧幀壓入記憶體棧,等函式執行完成返回時,才出棧。...

遞迴與斐波那契數列

迭代實現 def fab n a1 1 a2 1 a3 1if n 1 print 輸入有誤 return 1 while n 2 0 a3 a1 a2 a1 a2 a2 a3 a 1return a3 result fab 20 if result 1 print 總共有 d對小兔子誕生 resu...