您的位置:首页 > 其它

斐波那契数列

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+"  ");
}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  斐波那契数列