基本格式:
一、典型示例--階乘函數:
function recurser ($n)
{
if ($n==0){
return 1;
}else{
return $n * recurser($n-1);
}
}
echo recurser(5);
理解圖:
我們看這個函數它實際是5*(4*(3*(2*(1*1)))))。
這樣我們就看出了return 1是干什麼用的了,當n的值為0時,我們不能返回0如果那樣結果肯定是0了,那就沒什麼意義,所以當我們要得到$n * recurser($n-1);時,要保證recurser($n-1)的值最小為1;比較for寫的這個,異曲同工:
$result = $n; //#1
for ($i= 1; $i<$n; $i++) { //#2
$result *= $i;
}
echo $result;
}
test(5);
注意:#1、#2這二段代碼不能按#2,#1的順序倒過來寫,因為這樣每次for都會調用$result = $n =5,最後輸出的值將是5*4=20。也不能去掉$result,直接將#3寫成這樣:$n*=$i;這是灰常嚴重的錯誤,因為循環過程中$i<$n中的$n值
二、遞歸的通用用法
1、找出規律
1 1 2 3 5 8 ...
從第項開始為前兩項的和。
function do_fibo($n) {
if($n<=2) {
return 1;
} else {
return do_fibo($n-1) * do_fibo($n-2);
}
}
2 3 8 63 ...
規律為後一項的值等於前一項值的平方減一。
function do_func($n) {
if($n <= 1) {
return 2;
} else {
$all = pow(do_func($n-1),2)-1;
return $all;
}
}
三、遞歸函數的用法
示例2:
function reverse_r($str){
global $i;
if(strlen($str)>0){
$i++;
//調用函數自身則為遞歸
reverse_r(substr($str,1));
echo substr($str,0,1);
}else{
echo 'It\'s over , there is '.$i." chars in this string !(include blanks)\n";
}
}
//測試字符串
$str = '! haeY hO';
$i=0;
//函數調用
reverse_r($str);
echo "\n";