斐波拉契数列带来的思考
2015-12-31 14:53
323 查看
无意间看到一道题:
编写一个计算前100位斐波那契数的函数。根据定义,斐波那契序列的前两位数字是0和1,随后的每个数字是前两个数字的和。例如,前10位斐波那契数为:0,1,1,2,3,5,8,13,21,34。
我一看这不是熟悉的斐波那契数列嘛,简单!一个递归搞定,就没重视了。然后晚上自己尝试写着玩,却发现原来自己智力被爆。
首先写了个这样的程序:
public class FibonnacciA{
public static void main(String[] args){
System.out.println(FibonnacciA.count(100));
}
public static int count(int t){
if(t==0){
return 0;
}else if(t==1){
return 1;
}else if(t>1){
return count(t-1)+count(t-2);
}else{
return 0;
}
}
}
尝试跑了下数列的前几位,没问题,然后跑100,诶?怎么跑不出结果?原来还是复杂度的锅。斐波那契数列的递归算法复杂度是O(n!),多么可怕。
然后将程序更改修正后,如下:
public class FibonnacciB{
public static void main(String[] args){
System.out.println(FibonnacciB.count(100L));
}
public static long count(long t){
if(t==0L){
return 0L;
}else if(t==1L){
return 1l;
}else if(t<0L){
System.out.println("请输入正整数!");
return 0L;
}
long temp1 = 0L;
long temp2 = 1L;
long temp = 0L;
for(long i=0L; i<t; i++){
temp = temp2;
temp2 = temp1 + temp2;
temp1 = temp;
}
return temp2;
}
}
注意到int已经装不下结果了,这里用了long。循环是线性复杂度O(n),结果秒出,真是舒服。
要好好的重视运算复杂度啊亲!
编写一个计算前100位斐波那契数的函数。根据定义,斐波那契序列的前两位数字是0和1,随后的每个数字是前两个数字的和。例如,前10位斐波那契数为:0,1,1,2,3,5,8,13,21,34。
我一看这不是熟悉的斐波那契数列嘛,简单!一个递归搞定,就没重视了。然后晚上自己尝试写着玩,却发现原来自己智力被爆。
首先写了个这样的程序:
public class FibonnacciA{
public static void main(String[] args){
System.out.println(FibonnacciA.count(100));
}
public static int count(int t){
if(t==0){
return 0;
}else if(t==1){
return 1;
}else if(t>1){
return count(t-1)+count(t-2);
}else{
return 0;
}
}
}
尝试跑了下数列的前几位,没问题,然后跑100,诶?怎么跑不出结果?原来还是复杂度的锅。斐波那契数列的递归算法复杂度是O(n!),多么可怕。
然后将程序更改修正后,如下:
public class FibonnacciB{
public static void main(String[] args){
System.out.println(FibonnacciB.count(100L));
}
public static long count(long t){
if(t==0L){
return 0L;
}else if(t==1L){
return 1l;
}else if(t<0L){
System.out.println("请输入正整数!");
return 0L;
}
long temp1 = 0L;
long temp2 = 1L;
long temp = 0L;
for(long i=0L; i<t; i++){
temp = temp2;
temp2 = temp1 + temp2;
temp1 = temp;
}
return temp2;
}
}
注意到int已经装不下结果了,这里用了long。循环是线性复杂度O(n),结果秒出,真是舒服。
要好好的重视运算复杂度啊亲!
相关文章推荐
- 有关数据库SQL递归查询在不同数据库中的实现方法
- C#中的递归APS和CPS模式详解
- WinForm实现按名称递归查找控件的方法
- 使用SqlServer CTE递归查询处理树、图和层次结构
- C#中的尾递归与Continuation详解
- C++线性时间的排序算法分析
- C#递归实现显示文件夹及所有文件并计算其大小的方法
- php实现斐波那契数列的简单写法
- php递归创建目录的方法
- C#直线的最小二乘法线性回归运算实例
- PHP递归创建多级目录
- Javascript递归打印Document层次关系实例分析
- oracle 使用递归的性能提示测试对比
- 使用curl递归下载软件脚本分享
- Perl脚本实现递归遍历目录下的文件
- JavaScript的递归之递归与循环示例介绍
- C# 递归查找树状目录实现方法
- 全排列算法的非递归实现与递归实现的方法(C++)
- php递归列出所有文件和目录的代码
- java递归菜单树转换成pojo对象