c++递归实例 以及递归法的优化

递归思想作为一种经典的编程思想,能过实现用简单的代码解决需要N次迭代求解的问题。递归思想的运用能够使程序可读性以及代码简介性得到很大提升。废话不多说,下面利用C++以及递归法解决一个经典的迭代问题。


问题描述: 假如第一个月买入一对幼兔,已知每一对幼兔能够在三个月后生产一队幼兔,那么请问第N个月后总共能得到几对兔子?

问题分析:每一对兔子都会在三个月大生产一对幼兔,新生的幼兔三个月后又会生产幼兔。如果用传统的编程方法,则需要找到第N月出生幼兔的数列规律然后数列求和,会显得很麻烦,而且代码的可读性和简洁性大打折扣。现在用递归的思想来解决问题就一目了然了。简单来说,思想就是:第N个月兔子总对数 = 第N-1个月的兔子总和 +第N个月出生的兔子数量。 而N个月出生的兔子的数量 = 第N-3个月的兔子的总数。于是递归的思想就体现出来了。


求第N个月兔子的数量

int Sum_month_N(int N){
     if( N<=3 ) return 1; //如果N小与3,第一对兔子还没有开始生产,因此返回1

     return sum_month(N-3)+sum_month(N-1); //返回三个月前的兔子(它们在本月都会孕育一对幼兔)的总对数加上个月兔子的总对数

};

OK问题完美解决,我们只需要在主函数中直接调用Sum_month_N 并传入参数就能返回正确的结果     

int main(){
      int N;
      cin>>N;
      for(int i = 0 ;i<=N;i++){
      cout<<"the sum of month "<<i<<" is : " <<2*ms->Sum_month_N((i)<<endl; 
      }

}

        到这里,问题貌似解决了,但是会出现一个问题,当N的取值比较小的时候,不会有问题,但是当N的取值比较大时,递归调用多层,就会消耗巨大的栈空间,而且程序的运行时间也会开销巨大。严重影响程序性能。

        我们注意到,每次我们输入不同的值的时候,都会去递归计算N-3的值以及N-1的值,如果我们之前在计算的时候把值保存下来,那么以后调用的时候就可以直接返回新值,就不用每次都递归。


int* month_N = new int[N];

int Sum_month_N(int N){

     if( N<=3 ) return 1; //如果N小与3,第一对兔子还没有开始生产,因此返回1


    if(month_N[N] !=0 ){

       return month_N[N];//直接返回记录的值

    }else{

     month_N[N] =  sum_month(N-3)+sum_month(N-1);

     return month_N[N]; //返回三个月前的兔子(它们在本月都会孕育一对幼兔)的总对数加上个月兔子的总对数

    }

};
    
很显然,这样做的话,时间上节约了,但是空间就会占用更大。是用空间换取时间的做法
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值