Fibonacci的遞迴實現與迴圈實現的區分

2021-10-03 03:49:36 字數 1448 閱讀 6330

大家都知道斐波那契數列,現在要求輸入乙個整數n,請你輸出斐波那契數列的第n項(從0開始,第0項為0)。

n<=39

遞迴呼叫實現fibonacci數列採用的自頂向下的演算法模式,利用

f(n) = f(n-1) + f(n-2),每次遞迴呼叫上一次的兩個fibonacci()函式。遞迴演算法對前n-2次所得數列中的資料不具有記憶性,故而導致其指數級演算法複雜度。

**如下

class solution:

def fibonacci(self, n):

# 如果是按照遞迴來寫的話, 時間複雜度就是隨著n的變化 增長率是 2^n

#遞迴實現

# n = 0 f(0) = 0

if n == 0:

return 0

# n = 1 f(1) = 1

if n == 1:

return 1

# if n > 1 f(n) = f(n-1) + f(n-2)

if n > 1:

num = self.fibonacci(n-1) + self.fibonacci(n-2)

return num

return none

迴圈呼叫使用的是自下而上的程式設計思想,定義每一次參與加法運算的fibonacci數列中的兩項,記錄較大的一項和此次加法運算的和,作為求fibonacci數列中下一項的兩個加法項,避免了遞迴呼叫時的多次重複運算,極大提高了演算法的執行效率。

簡單描述演算法思想

1.有a和b兩個初始資料,假設a始終是較大的乙個數,b始終是較小的乙個數。

2.若第n-1項的數值為a,n-2項的數值為b,根據fibonacci數列中各項的性質,第n項的數值ret=a + b。

3.遞迴呼叫時,每次計算第n項的值時,重新計算a和b的數值,而迴圈方法規定每次運算時較大的數作為a,方便計算下一項時直接獲取加法的其中的一項資料。即通過a、b和ret三者計算所需第n項的資料。

演算法流程

**如下

class solution:

def fibonacci(self, n):

if n == 0:

return 0

if n == 1:

return 1

a = 1

b = 0

for i in range(0,n-1):

ret = a+b

b = a

a = ret

return ret

Fibonacci數列的遞迴與非遞迴實現

fibonacci 斐波那契 數列定義 1 遞迴實現 思想簡單,無需贅述,實現如下 遞迴方法複雜度o 2 n 計算到n 41已達到計算機的極限 int f int n int fibonacci1 int len 該方法存在很多重複計算,雖然是典型的遞迴,但效率很低,資源消耗大。經分析,改演算法時間...

Fibonacci數列的遞迴與非遞迴實現演算法詳解

遞迴演算法 因為遞迴需要不斷的呼叫自身,當n過大的時候,程式將會很慢效率不高,不推薦使用,關於遞迴實現演算法,也很簡單,很多教科書上都是這種解法。遞迴演算法 long long fibonacci unsigned int n 非遞迴演算法 我主要講述一下非遞迴演算法的實現,非遞迴演算法是比較實用的...

遞迴函式與fibonacci

1 deff n 2if n 1 3return 1 4return n f n 1 5print f 5 結果為 120 即5的階乘 通過這個例子來看遞迴函式有著兩個特點 1 呼叫自己 2 結束條件 在賦值最後一項的時候同時shutdown fibonacci數列形式 0 1 1 2 3 5 8 ...