1. 程式人生 > 其它 >實現裴波納契數列_Python和ELM榆木語言實現基本演算法2:斐波那契數列

實現裴波納契數列_Python和ELM榆木語言實現基本演算法2:斐波那契數列

技術標籤:實現裴波納契數列

79878eed0e2bd8ca44d3c18d99f7c0c5.png

斐波那契數列(Fibonacci sequence),又稱黃金分割數列、因數學家列昂納多·斐波那契(Leonardoda Fibonacci)以兔子繁殖為例子而引入,故又稱為“兔子數列”,指的是這樣一個數列:1、1、2、3、5、8、13、21、34、……在數學上,斐波那契數列以如下被以遞推的方法定義:F(1)=1,F(2)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 3,n ∈ N*)在現代物理、準晶體結構、化學等領域,斐波納契數列都有直接的應用。

在數學上,斐波那契數列是以遞迴的方法來定義:

  • {displaystyle F_{0}=0}
  • {displaystyle F_{1}=1}
  • {displaystyle F_{n}=F_{n-1}+F_{n-2}}(n≧2)

用文字來說,就是斐波那契數列由0和1開始,之後的斐波那契數就是由之前的兩數相加而得出。首幾個斐波那契數是:

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233……

一、python用遞迴實現程式碼:

deffibonacci(m):ifm<=2:return1else:returnfibonacci(m-1)+fibonacci(m-2)foriinrange(1000):print(fibonacci(i))

二、ELM榆木用遞迴實現程式碼:

importHtmlexposing(text,div)importDebugexposing(toString)importListexposing(range,map)fibonacci:Int->Intfibonaccin=   casenof      0->       1      1->       1      2->       1      _->       fibonacci(n-2)+fibonacci(n-1)viewm=textviewx)
a392e25ba0068bd97034858eb1679d34.png

三、python用陣列記憶化搜尋程式碼:

當m很大時,遞迴的執行速度會明顯變慢。根本原因在於遞迴演算法進行了大量的重複運算。所以可以開一個數組,記錄每個被計算過的函式值。每次呼叫函式時,如果函式被計算過,就直接呼叫計算好的結果。

temp=[0]*10000deffibonacci(m):       iftemp[m]!=0:             #實現記憶化搜尋優化             returntemp[m]       else:             ifm<=2:                    return1             else:                     returnfibonacci(m-1)+fibonacci(m-2)foriinrange(1000):       print(fibonacci(i))

四、雖然記憶搜尋優化後快了很多,但仍然不是最好的。本問題遞推順序明顯,用一個for迴圈就可以解決問題了。

python 程式碼如下:

m1=1m2=1m3=1print(m1)print(m2)foriinrange(3,10,1):m3=m1+m2m1=m2m2=m3print(m3)

本節總結:遞迴很適合表示斐波那契數列,但for迴圈更快,據說elm榆木語言的尾遞迴實現也和for迴圈有類似的效能,有時間嘗試實現。