/*
---描述:
著名的斐波那契数列:从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代码示例,展示如何通过不同方法计算数列中的值。

1757

被折叠的 条评论
为什么被折叠?



