程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> PHP基礎知識 >> PHP 遞歸函數 使用教程

PHP 遞歸函數 使用教程

編輯:PHP基礎知識
 

基本格式:
function f($n){
  if (conditions){}
  else{
  f();
  }
}



一、典型示例--階乘函數:
function recurser ($n)
{   
 if ($n==0){
  return 1;
 }else{
  return $n * recurser($n-1);
 }
}
echo recurser(5);
理解圖:
遞歸函數 - sumsung753 - sumsung753 的博客
我們看這個函數它實際是5*(4*(3*(2*(1*1)))))。
這樣我們就看出了return 1是干什麼用的了,當n的值為0時,我們不能返回0如果那樣結果肯定是0了,那就沒什麼意義,所以當我們要得到$n * recurser($n-1);時,要保證recurser($n-1)的值最小為1;比較for寫的這個,異曲同工:
  function test ($n){ 
  $result = $n; //#1
  for ($i= 1; $i<$n; $i++) { //#2
    $result *= $i; //#3  
  } 
  echo $result;
}
test(5);
     注意:#1、#2這二段代碼不能按#2,#1的順序倒過來寫,因為這樣每次for都會調用$result = $n =5,最後輸出的值將是5*4=20。也不能去掉$result,直接將#3寫成這樣:$n*=$i;這是灰常嚴重的錯誤,因為循環過程中$i<$n中的$n值在不斷變大(第一次,$i =1,$n=$n*$i =5,第二次for循環判斷,$i<$n為2<5,第三次,$n=$n*$i=3*5=15,$i<$n為3<15...這樣這個判斷中$n在不斷變大,$i也會不斷變大),將進入無限循環。
 

二、遞歸的通用用法

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";

 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved