递归思想作为一种经典的编程思想,能过实现用简单的代码解决需要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的值,如果我们之前在计算的时候把值保存下来,那么以后调用的时候就可以直接返回新值,就不用每次都递归。
|