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

         斐波那契数列又称黄金分割数列、因数学家列昂纳多·斐波那契以兔子繁殖为例子而引入,故又称为“兔子数列”。

指的是这样一个数列: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);
}

}

以上三种方式,效率依次递增。建议使用第三种方式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值