1. 程式人生 > >Fibonacci(斐波那契)數列的遞迴與非遞迴實現 python

Fibonacci(斐波那契)數列的遞迴與非遞迴實現 python

Fibonacci數列為:0、1、1、2、3、5、8、13、21......

數列第一項為0,第二項為1,從第三項開始,每一項為相鄰前兩項之和。

用遞迴的方法來定義:

  • F(0) = 0 
  • F(1) = 1
  • F(n) = F(n-1) + F(n-2) , n>=2

用遞迴方法實現程式碼:

# python 3.4
x = int ( input ("輸入一個數:") )
def fibonacci ( n ) :
	if n == 0 : 
		return 0
	elif n == 1 :
		return 1
	else :
		return fibonacci( n - 1 ) + fibonacci( n - 2 )
for i in range ( 0 , x ) :
	print(fibonacci(i))

用非遞迴方法實現程式碼: 
# python 3.4
x = int ( input ("輸入一個數:") )
arr = [ 0, 1, 1 ]   #計算陣列中任意一項,需要用到的變數不超過3個,因此只需要用一個長度為3的陣列
for i in range(0 , x ):      
	print ( str(arr[i%3])+"   " )           #第n祥依次放在下標為n%3的陣列中
	arr[i%3]=arr[(i+1)%3] + arr[(i+2)%3]    #將該陣列看成一個迴圈連結串列,則每一項輸出後,相應的位置用來放項數比它大3的值,而這個值就是陣列的後兩項想加
(其實只需要兩個變數就ok了)

用遞迴方法程式清晰易懂,但是開銷大。分別給兩個程式加一個計時語句,看看n = 30 時兩個程式執行時間相差多少。

修改後的程式碼:

# python 3.4
from time import clock
x = int ( input ("輸入一個數:") )
clock()
def fibonacci ( n ) :
	if n == 0 :
		return 0
	elif n == 1 :
		return 1
	else :
		return fibonacci( n - 1 ) + fibonacci( n - 2 )
for i in range ( 0 , x ) :
	print(fibonacci(i))
print("running time is %-5.5ss" %clock())

# python 3.4
from time import clock
x = int ( input ("輸入一個數:") )
clock()
arr = [ 0, 1, 1 ]   
for i in range(0 , x ):      
	print ( str(arr[i%3])+"   " )         
	arr[i%3]=arr[(i+1)%3] + arr[(i+2)%3]
print("running time is %-5.5ss" %clock())

執行結果分別是:

遞迴方法求解:

非遞迴方法求解: