递归程序调用自身的编程技巧,要实现递归得有两个条件:一、有反复执行的过程(调用自身);二、有跳出反复执行过程的条件(递归出口)。
1 有一头母牛,到4岁可生育,每年一头,所生均是一样的母牛,到15岁绝育,不能再生,20岁死亡,问n年后有多少头牛。
<?php
function t($n){
static $num=1;
for($i=1;$i<$n;$i++){
if($i>=4&&$i<15) {$num++;t($num-$i);}
if($i>20) $num--;
}
return $num;
}
//test
echo t(20);
?>
2 <p>阶乘问题</p> 3*f(2) 2*f(1) 1*f(0);在返回去(出栈,后进先出)f(0)=1,f(1)=1*1=1,f(2)=2*1=2最后得出3*2=6。
<?php
function factorial($n){
static $num;
if($n==0)
return 1;
else
$num=$n*factorial($n-1);
return $num;
}
//test
echo factorial(3);
?>
3全排列问题
<?php function Swap(&$str,$m,$k){ $temp=$str[$m]; $str[$m]=$str[$k]; $str[$k]=$temp; //return $str; } function perm($arr,$k,$m){ if($k==$m){ static $so=1; //echo $arr; printf("第%d个全排列是%s",$so,$arr); $so++; //echo"<br/>";可以换行 //echo" ";换不了行 //echo " ";换不了 //echo" ";换不了 echo"<p></p>";//可以换行 } else{ for($i=$k;$i<=$m;$i++){ Swap($arr,$k,$i); perm($arr,$k+1,$m); Swap($arr,$k,$i); } } } $str="abc"; function foo($str){ perm($str,0,strlen($str)-1); } foo($str); ?>
第1个全排列是abc
第2个全排列是acb
第3个全排列是bac
第4个全排列是bca
第5个全排列是cba
第6个全排列是cab
考虑有重复项的问题,比如abb,则应先判断在交换
<?php function IsSwap($str,$k,$m){ for($i=$k;$i<$m;$i++){ if($str[$i]==$str[$m]) return false; return true; } } function Swap(&$str,$m,$k){ $temp=$str[$m]; $str[$m]=$str[$k]; $str[$k]=$temp; //return $str; } function perm($arr,$k,$m){ if($k==$m){ static $so=1; printf("第%d个全排列是%s",$so,$arr); $so++; echo"<br/>";//可以换行 } else{ for($i=$k;$i<=$m;$i++){ if(IsSwap($arr,$k,$i)){ Swap($arr,$k,$i); perm($arr,$k+1,$m); Swap($arr,$k,$i); } } } } $str="abb"; function foo($str){ perm($str,0,strlen($str)-1); } foo($str); ?>
4fibonacci数列,用递归浪费了不少时间,所以循环可以成为O(N)复杂度问题
#include<iostream> #include<string> #include<time.h> using namespace std; long Fabonacci(unsigned int n){ if(n==0) return 0; else if(n==1) return 1; else return Fabonacci(n-1)+Fabonacci(n-2); } //利用递归重复计算了好多,画一下二叉树就知道了,改循环方法。 long Fabonacci2(unsigned int n){ if(n==0) return 0; if(n==1) return 1; unsigned int firstItem=0; unsigned int secondItem=1; long fib=0; int cnt=1; while (cnt<n){ fib=firstItem+secondItem; firstItem=secondItem; secondItem=fib; ++cnt; } return fib; } int main(){ //递归求解1 cout<<"Enter An N:"<<endl; unsigned int number=0; cin>>number; clock_t start,finish; start=clock(); cout<<"递归1:"<<Fabonacci(number)<<endl; finish=clock(); double totaltime; totaltime=(double)(finish-start)/CLOCKS_PER_SEC; cout<<totaltime<<endl; //Fibonacci2循环求解 clock_t start1,finish1; start1=clock(); cout<<"循环"<<Fabonacci2(number)<<endl; finish1=clock(); double totaltime1; totaltime1=(double)(finish1-start1)/CLOCKS_PER_SEC; cout<<totaltime1<<endl; return 0; }