编程题:大家都知道裴波那契数列,现在要求输入一个整数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)自己对于错误提示还不太会看,否则改起来应该会更快一点。