PHP中遞迴函式的一個常見邏輯問題
阿新 • • 發佈:2019-01-08
首先,我們得知道遞迴函式是什麼東西,通俗來講也就是自己呼叫自己本身的函式。
現在需要設計一段程式碼,解決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:
A中打印不出想要的結果,B中可以實現。而A和B程式碼中的唯一差別就是在if中添加了一個return。<?php //遞迴函式 $num=10; function add($sum){ static $tot; if($sum>=1){ $tot+=$sum; return add(--$sum); }else{ return $tot; } } echo add($num); ?>
下面就開始分析整個遞迴的過程,完全可以去看看盜夢空間加深理解了:(以不能實現的A程式碼為例)
1.將10帶入函式中,if語句判斷之後,$tot開始疊加。
2.這裡重點來了:將引數減一之後重新帶入函式中。(沒有返回值!!!)
3.接著上面的過程一直迴圈,一直到$sum=1,這從外到內,由10到1,這10層的迴圈都沒有返回值。
4.$sum=0的時候,要求有返回值。
就好像,盜夢空間中,主角在11層夢境中醒來,但是前面10層的夢境都處於睡眠階段。這主角你覺得醒的過來嗎,明顯不可能。他只能卡在第11層夢境,永遠醒不過來。
唯一能讓主角醒過來的辦法也就是他的每一層夢醒都醒過來,一直回到現實生活中。而相對與A程式碼,B程式碼則從第一層開始就要求有返回值,一直到11層都要有返回值。所以11層醒過來之後激活了第10層,然後一層一層的啟用,最後就順利醒過來了,這個最後的結果也就正確輸出了。
怪不得他們說盜夢空間用遞迴函式很好解釋,想來確實有點。
剩下的就是自己再深入理解了,一上來確實會有點暈。