-
斐波那契数列求第n项的两种算法
-
斐波那契数列前n项和
-
青蛙跳台问题以及拓展问题
1、《剑指offor》第九题 ,这里所设斐波那契数列为0,1,1,2,3....分别为数列的第0,1,2,3,4项........,代码可以根据需求自行更改。
第一种算法利用C语言的递归实现。具体如下:
#include <stdio.h>
int Fibonacci(int receive)
{
if (receive < 0)
{
printf("输入值不合法!!!");
return -1;
}
else if (receive == 0)
return 0;
else if (receive == 1)
return 1;
else
{
return Fibonacci(receive - 1) + Fibonacci(receive - 2);
}
}
int main()
{
int input = 0;
printf("请输入所求斐波那契数列的第几项为:");
scanf_s("%d", &input);
int result=Fibonacci(input);
printf("所求斐波那契数列的第%d项为:%d", input, result);
return 0;
}
第二种算法利用加一个变量保存前两个数值的和,其和为数列下一个值大小。并且利用此值作为桥梁传递到下一个值以供二次使用,大大减少了算法量的大小,减小了冗余。
int Fibonacci(int receive)
{
if (receive <0)
{
printf("输入值不合法!!!");
return -1;
}
if (receive == 0)
return 0;
if (receive == 1)
return 1;
int locationone = 0, i = 0;
int locationtwo = 1;
int nextone = 0;
for (i = 2; i <=receive; i++)
{
nextone = locationone + locationtwo; //产生的下一个数列值
locationone = locationtwo;
locationtwo = nextone;
}
return nextone;
}
int main()
{
int input = 0;
printf("请输入所求斐波那契数列的第几项为:");
scanf_s("%d", &input);
int result = Fibonacci(input);
printf("所求斐波那契数列的第%d项为:%d", input, result);
return 0;
}
2、斐波那契前n项和,这里的n为前面的n+1。这里所设斐波那契数列为0,1,1,2,3....分别为数列的第1,2,3,4,5项........,代码可以根据需求自行更改。这个代码含义与上面不太一样,可以对比着看。
这里利用调用函数不断返回数列值,从而利用for循环进行数列值累加。
#include <stdio.h>
int Fibonacci(const int receive)
{
if (receive <= 0)
{
printf("输入值不合法!!!");
return -1;
}
if (receive == 1)
return 0;
if (receive == 2)
return 1;
int locationone = 0, i = 0;
int locationtwo = 1;
int nextone = 0;
for (i = 3; i <= receive; i++)
{
nextone = locationone + locationtwo; //数列下一项
locationone = locationtwo;
locationtwo = nextone;
}
return nextone;
}
int main()
{
int input = 0;
int result = 0;
int i = 0;
printf("请输入所求斐波那契数列的前几项和为:");
scanf_s("%d", &input);
for (i = 1; i <= input; i++)
{
result+= Fibonacci(i);
}
printf("所求斐波那契数列的第%d项和为:%d", input, result);
return 0;
}
3、青蛙跳台问题
若n为3或小于3的话,我们可以显然发现,此时跳法的数目等于n。当然,这是特殊情况。
若n大于3时,我们把n
级台阶时的跳法看成是n
的函数, 记为 f(n)。n
>2
时,一是第一次跳的时候就有两种不同的选择:一
是第一次只跳1
级,此时跳
法数目等于后面
剩下的 n-1
台阶的跳法
数目,即为f( n-1
);
另外一种选择是第一
次跳2级台阶 ,
此
时跳法数目等于后面剩下的
n-2
级台阶的跳法数目,即为f(n-2)
。因此n
级台阶的不同跳法的总数f(
n)=
f(
n-1
)+f(n-2)。分析到这里,我们不难看出这实际上就是斐波那契数列了。
因此,此问题是斐波那契数列问题的拓展。
#include <stdio.h>
//青蛙跳台阶问题
int Fibonacci(const int receive)
{
if (receive <= 0)
{
printf("输入值不合法!!!");
return -1;
}
if (receive < 3)
{
return receive;
}
else
{
return Fibonacci(receive - 1) + Fibonacci(receive - 2);
}
}
int main()
{
int input = 0;
int result = 0;
int i = 0;
printf("该青蛙跳上一个n阶台阶,其中n为:");
scanf_s("%d", &input);
result = Fibonacci(input);
printf("此青蛙跳上一个%d阶台阶总共有%d种算法", input, result);
return 0;
}
相似的问题还有:
我们可以用 2x1(图 2.13 的左边〉的小矩形横着或者竖着去覆盖更大的矩形。请问用 2x8的小矩形无重叠地覆盖 的大矩形(图 2.13的右边),总共有多少种方法?
以上图片来自《剑指offer》书籍,以上代码若有错误,欢迎留言。