斐波那契数列
2015-08-03 12:46
204 查看
/*
---描述:
著名的斐波那契数列:从n>2开始,后面的每个数是前面两个数之和,例如
1 1 2 3 5 8 13······
算法思想:递归方式:通过数列找出递推项,推出循环不不变式,通过观察可以发现从n>2开始,后面的每个数的值是前面两个数之和,因此递推项为 f(n)=f(n-1)+f(n-2)
所以如果运用递归的方法来做,那么是:想求f(n)那么先求f(n-1)+f(n-2),而求f(n-1)就要求f(n-2)+f(n-3),同样f(n-2)也是,那么这样向后推,递归。递归的终止条件是n>=2时,f(n)=1.
循环方式:通过递推项,我们可以归纳出循环不变式,假如如果用a,b,c分别代替f(n-2),f(n-1),f(n)那么这样我们会发现循环不变式为( c=a+b,b=c,a=b )。
*/
class MethodImpl
{
public static void main(String[] args)
{
System.out.println(feiBo(6));
//feiBoNa1(10);
//System.out.println("-------------");
//feiBoNa2(4);
}
//递归算法(每个月兔子的数量) n为当月兔子的数量,
public static int feiBo(int n)
{
if(n<=2)
{
return 1;
}else{
return feiBo(n-1)+feiBo(n-2);
}
}
//非递归算法 n为从第三个月起,你所要输出的月的个数
public static void feiBoNa1(int n )
{
//第1个和第2个月的数量为1,
int a = 1;
int b = 1;
int c = 0;//为第三个月,要从第三个月开始循环
System.out.print(a+" "+b+" ");
for(int i = 1; i<=n; i++)
{
c = a + b;
System.out.print(c+" ");
a = b;
b = c;
}
}
/*循环算法优化,观察到其实递推的循环式可以更加简单,
1 2
3 4
5 6 7
8 9
a b
c=a+b a=b+c
b=c+a c=a+b
a=b+c b+c+a
········
这样,我们发现循环递推式由(a b c=a+b a=b b=c c=a+b)变为(c=a+b a=b+c b=c+a )
所以代码
*/
//n为从第三个月起,你所要输出的月的个数,又因为这个循环不变式是3个,所以实际输出的应该是n*3个月的个数
public static void feiBoNa2(int n )
{
//第1个和第2个月的数量为1,
int a = 1;
int b = 1;
int c = 0;//为第三个月,要从第三个月开始循环
System.out.print(a+" "+b+" ");
for(int i = 1; i<=n; i++)
{
c = a + b;
a = b+c;
b = c+a;
System.out.print(c+" "+a+" "+b+" ");
}
}
}
---描述:
著名的斐波那契数列:从n>2开始,后面的每个数是前面两个数之和,例如
1 1 2 3 5 8 13······
算法思想:递归方式:通过数列找出递推项,推出循环不不变式,通过观察可以发现从n>2开始,后面的每个数的值是前面两个数之和,因此递推项为 f(n)=f(n-1)+f(n-2)
所以如果运用递归的方法来做,那么是:想求f(n)那么先求f(n-1)+f(n-2),而求f(n-1)就要求f(n-2)+f(n-3),同样f(n-2)也是,那么这样向后推,递归。递归的终止条件是n>=2时,f(n)=1.
循环方式:通过递推项,我们可以归纳出循环不变式,假如如果用a,b,c分别代替f(n-2),f(n-1),f(n)那么这样我们会发现循环不变式为( c=a+b,b=c,a=b )。
*/
class MethodImpl
{
public static void main(String[] args)
{
System.out.println(feiBo(6));
//feiBoNa1(10);
//System.out.println("-------------");
//feiBoNa2(4);
}
//递归算法(每个月兔子的数量) n为当月兔子的数量,
public static int feiBo(int n)
{
if(n<=2)
{
return 1;
}else{
return feiBo(n-1)+feiBo(n-2);
}
}
//非递归算法 n为从第三个月起,你所要输出的月的个数
public static void feiBoNa1(int n )
{
//第1个和第2个月的数量为1,
int a = 1;
int b = 1;
int c = 0;//为第三个月,要从第三个月开始循环
System.out.print(a+" "+b+" ");
for(int i = 1; i<=n; i++)
{
c = a + b;
System.out.print(c+" ");
a = b;
b = c;
}
}
/*循环算法优化,观察到其实递推的循环式可以更加简单,
1 2
3 4
5 6 7
8 9
a b
c=a+b a=b+c
b=c+a c=a+b
a=b+c b+c+a
········
这样,我们发现循环递推式由(a b c=a+b a=b b=c c=a+b)变为(c=a+b a=b+c b=c+a )
所以代码
*/
//n为从第三个月起,你所要输出的月的个数,又因为这个循环不变式是3个,所以实际输出的应该是n*3个月的个数
public static void feiBoNa2(int n )
{
//第1个和第2个月的数量为1,
int a = 1;
int b = 1;
int c = 0;//为第三个月,要从第三个月开始循环
System.out.print(a+" "+b+" ");
for(int i = 1; i<=n; i++)
{
c = a + b;
a = b+c;
b = c+a;
System.out.print(c+" "+a+" "+b+" ");
}
}
}
相关文章推荐
- java实现斐波那契数列的3种方法
- java数学归纳法非递归求斐波那契数列的方法
- C++输出斐波那契数列的两种实现方法
- 求斐波那契(Fibonacci)数列通项的七种实现方法
- 数学公式
- Go语言学习笔记(练习) - 斐波那契数列
- leetcode 虐我篇之(二十一)Climbing Stairs
- 青蛙跳台阶解法 时间复杂度O(n) 空间复杂度O(1)
- 斐波那契数列及相关问题
- 关于斐波那契数列的复杂度最低算法
- Tyvj专题 P1337 fibonacci数列
- HDOJ 2044 一只小蜜蜂
- java编程:三种方法实现斐波那契数列
- 黑马程序员-递归-斐波那契数列-1到100的和
- 九度1389 剑指offer 变态跳台阶
- 矩阵快速幂求斐波那契数列 poj3070
- 递归之斐波那契数列
- 斐波那契数列时间复杂性的近似证明和精确证明
- Climbing Stairs
- 斐波那契数列