斐波那契数列三种实现方式
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);
}
}
以上三种方式,效率依次递增。建议使用第三种方式。
指的是这样一个数列: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);
}
}
以上三种方式,效率依次递增。建议使用第三种方式。
相关文章推荐
- 详解python使用递归、尾递归、循环三种方式实现斐波那契数列
- 实现斐波那契数列的三种方式
- 斐波那契数列的三种实现方式
- 分别用的列表,递归,生成器三种方式创建出n个元素的斐波那契数列(Python3实现)
- Android 三种方式实现自定义圆形页面加载中效果的进度条
- 分布式锁的三种实现方式
- Android自定义View的三种实现方式
- SSO单点登录三种情况的实现方式详解 单点登录(SSO——Single Sign On)
- 翻转数组 (三种实现方式)
- Android三种实现自定义ProgressBar的方式介绍
- iOS 图片模糊效果三种实现方式
- 三种方式实现--从尾到头输出链表
- HTML5实现动画三种方式
- 用C++实现二叉树的三种遍历方式
- java_security之base64原理解析以及三种代码的实现方式
- C#CreateGraphics方法的三种实现方式
- 在ABAP里实现条件断点的三种方式
- 三种方法实现斐波那契数列
- 二叉树三种遍历方式的六种实现方法
- android开发游记:RecycleView 实现复杂首页布局三种方式