分享

兔子繁殖问题

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




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


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

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多