兔子繁殖问题 - 两种递归思路

题目——
有一对兔子出生,从第三月起,每个月生一对兔子,出生的兔子也是第三月起每个月生一对兔子,请问2年后,共有多少只兔子?
分析思路——
斐波那契数列问题,用递归方法解决
我的程序——
思路一: 传统的递归方法
<pre name="code" class="java">public static long calculate(long n){
       if(n == 1){
             return 1;
   }else if(n == 2){
             return 1;
   }else {
           return calculate(n -1) + calculate(n -2);
    }
}


 
 
   然而,这种算法的时间复杂度是 O(2^n)。我是这样计算的,假设找出第n个月兔子总数的算法的复杂度(时间)是T(n),而用一个常量
A来表示找出第1和2个月兔子总数所花费的时间;那么将会有: T(n) = T(n -1)+ T(n - 2) + A; 用高中数列知识解,可知其结果是2^n的数量级的。
思路二——
注意到最新一个月的兔子数量肯定是前两个月的兔子数量的相加。为了避免思路一那样冗余的计算到第一和第二个月的结果,我们每算出一个月的结果便用两个变量来存储前两个月的数目,如此通过相加即可得到最后一个月的数目。 
          
import java.util.Scanner;
public class Main {
 public static void main(String[] args) {
  Scanner scan = new Scanner(System.in);
  //输入第n个月
  int n = scan.nextInt();
  System.out.println(calculate(n));
 }
 
 private static long calculate(long n){
  long f1 = 1;
  long f2 =1 ;
  long f3 = 2;
 
  if(n == 0){
   return f1;
  }else if(n == 1){
   return f2;
  }else if(n ==2){
   return f3;
  }
 
  for (int i = 3; i <=n; i++) {
   f1 = f2;
   f2 = f3;
   f3 = f1 + f2;
  }
   
  return f2;
 }
}


明显,思路二的时间主要地花在了  for (int i = 3; i <=n; i++) {
   f1 = f2;
   f2 = f3;
   f3 = f1 + f2;
  }
   这个循环里,因此整个程序的时间复杂度是O(n) ,改进了不少。

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值