zoukankan      html  css  js  c++  java
  • 求牛头算法(递归)

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

    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;
    }
  • 相关阅读:
    Chat Application using Web services in C#(转载)
    Asynchronous Method Invocation(转载)
    Passing Data between Windows Forms(转载)
    Fill in PDF Form Fields using the Open Source iTextSharp Dynamic Link Library(转载)
    The ShutDown Alarm(转载)
    使用blowery.Web.HttpCompress.dll对aspx压缩
    C# Voice and Tone Alert Generator(转载)
    Compress Folders with C# and the SharpZipLib(转载)
    Ubuntu 12.10 修改窗口按键布局(buttom_layout)到右边
    同步CM9源代码
  • 原文地址:https://www.cnblogs.com/air5215/p/5234602.html
Copyright © 2011-2022 走看看