您的位置:首页 > 其它

斐波那契数列三种实现方式

2017-09-08 16:57 246 查看
         斐波那契数列又称黄金分割数列、因数学家列昂纳多·斐波那契以兔子繁殖为例子而引入,故又称为“兔子数列”。

指的是这样一个数列:1、1、2、3、5、8、13、21、34、……

在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1,
F(n)=F(n-1)+F(n-2)(n>=2,n∈N*)

下面介绍下实现num以内的斐波那契数列3种方式:
1.递归算法:
public  static void findAll(int num){
List<Integer> nums = new ArrayList<Integer>();
for(int i=1;i<=num;i++){
if(F(i)>num) break;
nums.add(F(i));
}
System.out.println(nums);

}
 //递归查询
    public static int F(int i){
if(i ==1){
return 1;
}
if(i==2){
return 1;
}
if(i>=3){
return F(i-1)+F(i-2);
}
return -1;
}

2.备忘录算法+递归算法
public  static void findAll(int num){
List<Integer> nums = new ArrayList<Integer>();
Map<Integer,Integer> map = new HashMap<>();
for(int i=1;i<=num;i++){
if(F(i,map)>num) break;
nums.add(F(i,map));
}
System.out.println(nums);

}
    / /递归查询,添加备忘录,避免重复查询F(i)
   public static int F(int i,Map<Integer,Integer> map){
if(i<1){
return -1;
}
if(i ==1){
return 1;
}
if(i==2){
return 1;
}
if(map.containsKey(i)){
return map.get(i);
}else{
int value = F(i-1,map) +F(i-2,map);
map.put(i, value);
return value;
}

}

3.动态规划
public  static void findAll(int num){
List<Integer> nums = new ArrayList<Integer>();
if(num==1){
System.out.println("["+num+"]");
}
if(num==2){
System.out.println("[1,1]");
}
if(num>=3){
int a =1 ,b =1;
nums.add(a);
nums.add(b);
for(int i=3;i<=num;i++){
int next = a+b;
a=b;
b=next;
if(next>=num){
break;
}
nums.add(next);
}
System.out.println(nums);
}

}

以上三种方式,效率依次递增。建议使用第三种方式。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: