1. 程式人生 > >『PHP學習筆記』系列四:利用函式遞迴呼叫思想解決【斐波那契數列】問題和【猴子吃桃問題】問題

『PHP學習筆記』系列四:利用函式遞迴呼叫思想解決【斐波那契數列】問題和【猴子吃桃問題】問題

什麼是函式遞迴思想?

  1. 遞迴思想:把一個相對複雜的問題,轉化為一個與原問題相似的,且規模較小的問題來求解。
  2. 遞迴方法只需少量的程式就可描述出解題過程所需要的多次重複計算,大大地減少了程式的程式碼量。
  3. 但在帶來便捷的同時,也會有一些缺點,函式遞迴的執行效率不高(多次呼叫時)。
  4. 遞迴呼叫是一種特殊的巢狀呼叫,是某個函式呼叫自己或者是呼叫其他函式後再次呼叫自己的,只要函式之間互相呼叫能產生迴圈的則一定是遞迴呼叫,遞迴呼叫一種解決方案,一種是邏輯思想,將一個大工作分為逐漸減小的小工作,遞迴是一種思想,只不過在程式中,就是依靠函式巢狀這個特性來實現了。

 

遞迴呼叫的定義:

遞迴呼叫就是在當前的函式中呼叫當前的函式並傳給相應的引數,這是一個動作,這一動作是層層進行的,直到滿足一般情況的的時候,才停止遞迴呼叫,開始從最後一個遞迴呼叫返回。

瞭解斐波那契數列:

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

問題:

  • 有如下一個數列:1,1, 2, 3, 5, 8, 13, 21,....... 其規則是:前兩個已知(即1和2),從第3個開始,其值為其左邊兩個值的和(此數列稱為斐波那契數列)。定義一個函式,該函式可以求出該數列的任意第n個數的值。 

程式碼實現:

<?php
//利用遞迴解決斐波那契數列問題
function math($number) {
	if ($number == 1 || $number == 2) {
		return 1;//遞迴出口
	}
	return math($number - 1) + math($number - 2);//遞迴呼叫函式
}
echo math(20) . "<hr />";
 ?>

執行結果: 

其他遞迴呼叫問題: 

1,已知,老五比老四小5歲,老四比老三小5歲,老三比老二小5歲,老二比老大小5歲,且老大為40歲。求老五的年齡為?

程式碼實現:

<?php
//例項:用遞迴呼叫求老五的年齡
function recursive($num) {
	//遞迴退出條件
	if ($num == 1) {
		return 40;
	} else {
		//遞迴呼叫
		return recursive($num - 1) - 5;
	}
}
echo "老五的年齡為:";
echo recursive(5);
echo "<hr />";
 ?>

執行結果:

 

2,猴子吃桃問題:

有一群猴子,去摘了一堆桃子,商量之後決定每天吃剩餘桃子的一半,當每天大家吃完桃子之後,有個貪心的小猴都會偷偷再吃一個桃子,按照這樣的方式猴子們每天都快樂的吃著桃子;直到第十天,當大家再想吃桃子時,發現只剩下一個桃子了。問:猴子們一共摘了多少桃子?【經典面試題】

問題分析:

按照題意,猴子們每天吃桃子的一半,小猴子再偷吃一個,等於每天都吃前一天剩餘桃子的一半加一個,知道第十天只剩一個桃子。

程式碼實現:

<?php
//例項:猴子吃桃
function numbers($numbers) {
    //遞迴退出條件
	if ($numbers == 10) {
		return 1;
	} else {
        //遞迴呼叫
		return (numbers($numbers + 1) + 1) * 2;
	}
}
echo "總共摘的桃子為:";
echo numbers(1);
echo "<hr />";
?>

執行結果: