求牛头算法(递归)

递归程序调用自身的编程技巧,要实现递归得有两个条件:一、有反复执行的过程(调用自身);二、有跳出反复执行过程的条件(递归出口)。

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;
}
原文地址:https://www.cnblogs.com/air5215/p/5234602.html