1. 程式人生 > >PHP中遞迴函式的一個常見邏輯問題

PHP中遞迴函式的一個常見邏輯問題

首先,我們得知道遞迴函式是什麼東西,通俗來講也就是自己呼叫自己本身的函式。

現在需要設計一段程式碼,解決1到10疊加的問題。

程式碼A:

<?php
	//遞迴函式
	$num=10;
	function add($sum){
		static $tot;
		if($sum>=1){
			$tot+=$sum;
			add(--$sum);
		}else{
			return $tot;
		}
	}
	echo add($num);
?>
程式碼B:
<?php
	//遞迴函式
	$num=10;
	function add($sum){
		static $tot;
		if($sum>=1){
			$tot+=$sum;
			return add(--$sum);
		}else{
			return $tot;
		}
	}
	echo add($num);
?>
A中打印不出想要的結果,B中可以實現。而A和B程式碼中的唯一差別就是在if中添加了一個return。

下面就開始分析整個遞迴的過程,完全可以去看看盜夢空間加深理解了:(以不能實現的A程式碼為例)

1.將10帶入函式中,if語句判斷之後,$tot開始疊加。

2.這裡重點來了:將引數減一之後重新帶入函式中。(沒有返回值!!!)

3.接著上面的過程一直迴圈,一直到$sum=1,這從外到內,由10到1,這10層的迴圈都沒有返回值。

4.$sum=0的時候,要求有返回值。

就好像,盜夢空間中,主角在11層夢境中醒來,但是前面10層的夢境都處於睡眠階段。這主角你覺得醒的過來嗎,明顯不可能。他只能卡在第11層夢境,永遠醒不過來。

唯一能讓主角醒過來的辦法也就是他的每一層夢醒都醒過來,一直回到現實生活中。而相對與A程式碼,B程式碼則從第一層開始就要求有返回值,一直到11層都要有返回值。所以11層醒過來之後激活了第10層,然後一層一層的啟用,最後就順利醒過來了,這個最後的結果也就正確輸出了。

怪不得他們說盜夢空間用遞迴函式很好解釋,想來確實有點。

剩下的就是自己再深入理解了,一上來確實會有點暈。