zoukankan      html  css  js  c++  java
  • 递归算法

    fun(n) = f(n-t)+f(n-1); 需要验证下周期性。

      其实,递归函数的工作过程就是自己调用自己。有一些问题用递归就很容易解决,简单的你自己都会吃惊。
            我们做事情,一般都是从头开始的,而递归却是从末尾开始的。比如上面的函数吧,当n>3时,它显然只能求助于n-1,n-2。而(n-1)>2,(n-2)>2时,它们就求助于:(n-1)-1,(n-1)-2;(n-2)-1,(n-2)-2;然后··············直到(n-k)<3,(n-k-1)<3时,函数Febc终于有了返回值1 了,它再从头开始计算,然后一直算到n 为止。
           通过上面的例子,我们知道递归一定要有一个停止的条件,否则递归就不知道停止了。在上面的例子中,     if(n<3)  return (1); 就是停止的条件。
          然而,使用递归的代价是十分巨大的:它会消耗大量的内存!!递归循环时它用的是堆栈,而堆栈的资源是十分有限的。上面的例子你只能用一个很小的n值。如果n=20,即Febc(20)的话,它将调用Febc(n)函数10000多次!!!而上面一个例子用循环也是十分容易写的:
    /*using turboc2*/
    int febc(int);
    main()
    {
       int n;
       scanf("%d",&n);
       febc(n);
    }
    int febc(int n)
    {
       int a[3],i;
       a[0]=a[1]=a[2]=1;
       for(i=3;i<=n;i++)
       a[i%3]=a[(i+1)%3]+a[(i+2)%3];      /*实现 Febc(i)=Febc(i-1)+Febc(i-2)*/
      printf("/n%d/n",a[n%3]);
    }
    有兴趣者不妨输入一个较大的n值,然后比较比较这二个函数计算的速度。当然, 如果你使用的n太大的话,递归可能发生错误。如果死机了可别骂我哦~~~ 我已经提醒过你了 :)
          现在我们再来看看一个求从1 加到100的循环:
    /*turboc2*/
    main()
    {   int i,n;
       for(i=1;i<101;i++)
        n+=i;  }
            这很简单没什么可说的。 但是,你能不能写出相应的递归函数呢?
            下面就是递归(请注意了,这种做法不推荐!! 我只是为了说明问题才这么写的。)
    /*using Turboc2*/
    int a=0;
    int account(int);
    main()
    {
       account(100);
       printf("%d",a);
    }
    int account(int i)
    {
       if(i==0) return 0;  /*停止条件*/ 
       else
       a+=account(i-1)+1; /*实现递归*/
    }
            在C/C++的问题中,我曾经回答过这样的一个问题:
            若一头小母牛,从出生起第四个年头开始每年生一头母牛,按此规律,第n年时有多少头母牛? 请问如何用递归涵数求此问题?
    先写出函数表达式:f(n)=f(n-1)+f(n-3) 
    为什么f(n)=f(n-1)+f(n-3)呢,请看:
    f(n)-f(n-1)=f(n-3)
    因为第n年要比n-1年多的牛,都是大于三岁的牛生的小牛,而f(n-3)正是那些在n年大于三岁的牛,然后它们在第n年生下相同数量的小牛。(请用BorlandC++3.1或其他C++编译器)
    #include<iostream.h>
    #include<conio.h>


    int cattle(int,int);


    void main()
    {
      int ct,n;
      cout<<"Please input the original cattle number:"<<endl;  /*输入起始牛的数量*/
      cin>>ct;
      cout<<"Input how many years it past:"<<endl;
      cin>>n;
      cout<<"You have "<<cattle(ct,n)<<" cattle now!"<<endl;
      getch();
    }


    int cattle(int ct,int n)
    {
      if(n<4)  return (ct);     /*停止条件*/
      else
      return (cattle(ct,n-1)+cattle(ct,n-3));     /*实现递归*/
    }
            怎么样,很简单吧。 会用循环求解吗?
            递归在实际的编程中并不常用,但是在某些情况下,它是非常强有力而漂亮的工具。掌握它的原理时会十分有用的。 
    ————————————————
    版权声明:本文为CSDN博主「hustyangju」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/hustyangju/article/details/22758637

  • 相关阅读:
    每天学习Linux之-系统启动过程
    差模和共模干扰
    每天学习Linux之-目录结构
    欧姆龙CP1H 原点搜索和原点返回功能
    NPN,PNP接线总结
    MyBatis插件开发
    MyBatis运行原理
    MyBatis逆向工程
    MyBatis-Spring整合
    MyBatis缓存机制
  • 原文地址:https://www.cnblogs.com/cy1993/p/11436113.html
Copyright © 2011-2022 走看看