• 剑指offer例题——裴波那契数列


    编程题:大家都知道裴波那契数列,现在要求输入一个整数n,请你输出裴波那契数列的第n项(从0开始,第0项为0)。n<=39

    1 public class Solution {
    2     public int Fibonacci(int n) {
    3         Double a = 1/Math.sqrt(5)*(Math.pow(((1+Math.sqrt(5))/2),n)-Math.pow(((1-Math.sqrt(5))/2),n));
    4         int b = a.intValue();
    5         return b;
    6     }
    7 }

    第一遍程序,结果运行时间和占用内存都不理想。

    裴波那契数列,嗯。。。我不属于“大家都知道”系列,先百度该数列,想起来了,这是高中数学接触的生兔子问题,即1、1、2、3、5、8、13、21、34、……其遵循F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>=3,n∈N*)

    由于查到其有一个通项公式:

    而且,n=0,1,2也都遵循该通式,故我的编程即从其入手。

    在上述运算过程中遇到的第一个问题,即sqrt与pow函数的使用,然后是Double到int的强制类型转换,我发现double无法强制转换为int,百度后,发现需要改为Double。

    double和Double的关系就像int和Integer的关系一样。一个是基本类型,一个是封装类类型。而基本类型是无法调用方法的,故需要用Double。

    之后查看大神的讨论,采用了迭代的方法求得了新程序。

     1 public class Solution {
     2     public int Fibonacci(int n) {
     3         int a = 1;
     4         int b = 0;
     5         int c = 0;
     6         if (n==0|n==1)
     7             return n;
     8         else
     9             for(int i = 2;i<=n;i++){
    10                 c = a+b;
    11                 b = a;
    12                 a = c;
    13             }
    14             return c;
    15     }
    16 }

    第二次编程,迭代部分已经编写出来了,但是运行始终出错,后来发现有三处错误:

    1)for的使用中,三部分之间用;符号隔离;

    2)对for循环中的i进行初始化时,忽略了类型int;

    3)对实例变量进行声明的时候,将其放在了else后面,结果一直提示错误。

    技巧:

    1)利用通式计算既耗时,又耗内存,而利用迭代,则时间和资源耗费都减少了。

    该次实战的经验:

    1)函数调用要符合规范;

    2)自己对于错误提示还不太会看,否则改起来应该会更快一点。

  • 相关阅读:
    有用的java工具
    AOP在大规模软件开发项目中的应用(图)
    java并发编程实践笔记
    深入JVM系列(三)之类加载、类加载器、双亲委派机制与常见问题
    JVM相关问答
    软件架构设计的六大原则
    JVM 运行时数据区域
    JVM 类加载过程
    JVM 垃圾回收算法
    Memcached内存分配优化及使用问题
  • 原文地址:https://www.cnblogs.com/10081-AA/p/10458679.html
Copyright © 2020-2023  润新知