斐波那契数列求第n项以及前n项和、相关的青蛙跳台问题

  1. 斐波那契数列求第n项的两种算法

  2. 斐波那契数列前n项和

  3. 青蛙跳台问题以及拓展问题

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》书籍,以上代码若有错误,欢迎留言。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天是蓝的嘛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值