生活中,我們用肉眼分辨為美的事物,常常神奇地包含了黃金分割比,此時就不得不感嘆一下:數(shù)學(xué)的美麗無處不在。而黃金分割數(shù)列(又稱斐波那契數(shù)列)的后一項(xiàng)與前一項(xiàng)比值的極限就是二分之根號五減一,約等于0.618(即黃金分割比例)。那么使用PHP要如何實(shí)現(xiàn)黃金分割數(shù)列呢,不急,我們慢慢來了解。
首先我們來了解一下黃金分割數(shù)列(即斐波那契數(shù)列):
斐波那契數(shù)列指的是這樣一個數(shù)列:
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765…….
即:前兩個值都為1,從第三位開始,每一位都是當(dāng)前位前兩位的和
規(guī)律公式為:
Fn = F(n-1) + F(n+1)
-
F:指當(dāng)前這個數(shù)列
-
n:指數(shù)列的下標(biāo)
好了,了解了黃金分割數(shù)列(斐波那契數(shù)列),下面我們來了解一下使用PHP實(shí)現(xiàn)的方法。
方法1:利用數(shù)組
觀察上面給出的數(shù)列,結(jié)合數(shù)組知識,可以分析出:
-
數(shù)組下標(biāo)為0或1時,元素的值為
1
; -
數(shù)組下標(biāo)為2時,元素是
a[0]+a[1]
; -
數(shù)組下標(biāo)為3時,元素是
a[1]+a[2]
; -
…..
-
數(shù)組下標(biāo)為n時,元素是
a[n-2]+a[n-1];
可以得出:
-
a[0]=1
-
a[1]=2
-
a[n]=a[n-2]+a[n-1]
(n>2)
代碼實(shí)現(xiàn):
<?php header("Content-type:text/html;charset=utf-8"); function test($num){ $arr=[]; for($i=0;$i<$num;$i++) { if($i==0 || $i==1){ $arr[$i]=1; }else{ $arr[$i]=$arr[$i-1]+$arr[$i-2]; } echo $arr[$i]." "; } } echo "斐波那契數(shù)列前10位:"; test(10); echo "<br>斐波那契數(shù)列前11位:"; test(11); echo "<br>斐波那契數(shù)列前12位:"; test(12); ?>
輸出:
了解了如何利用數(shù)組來求斐波那契數(shù)列,下面我們來看看利用遞歸來求斐波那契數(shù)列。
方法2:使用遞歸
<?php header("Content-type:text/html;charset=utf-8"); function fbnq($n) { if ($n <= 0) { return 0; } if ($n == 1 || $n == 2) { return 1; } return fbnq($n - 1) + fbnq($n - 2); } echo "斐波那契數(shù)列第10位:" . fbnq(10); echo "<br>斐波那契數(shù)列第11位:" . fbnq(11); echo "<br>斐波那契數(shù)列第12位:" . fbnq(12); ?>
輸出:
遞歸法也實(shí)現(xiàn)出來了,是不是很簡單!
遞歸算法可以將一個負(fù)責(zé)的問題使用較短的代碼將問題解決出來,但是運(yùn)行的效率比較低。
好了就說到這里了,有其他想知道的,可以點(diǎn)擊這個哦?!?→php視頻教程