C语言实现斐波那契数列,青蛙跳台阶问题

目录

一.斐波那契数列介绍

二.斐波那契数列的图示和C语言实现

三.斐波那契数列的类似问题——青蛙跳台阶问题


一.斐波那契数列介绍

        斐波那契数列指的是这样一个数列:1,1,2,3,5,8,13,21,34,55,89,从第三项开始每一项都是前两项的和。

        斐波那契数列(Fibonacci sequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(Leonardo Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波那契数列以如下被以递推的方法定义:F(0)=0,F(1)=1, F(n)=F(n - 1)+F(n - 2)(≥ 2,∈ N*)

        上述文献来自百度百科——斐波那契数列

二.斐波那契数列的图示和C语言实现

      这个是一个递归的经典问题,分解来看每一项的得数都是前两项的和,只有前两项为1,所以得出以下的递归程序。

int Fib(int n)
{
    count++;
	if (n <= 2)
		return 1;
	else
		return Fib(n - 1) + Fib(n - 2);
}

        但是,由于每一次递归都要在内存栈区开辟一块空间用来满足递归函数的需要,所以如果数字过大,可能会产生栈溢出的现象,我们设置一个全局变量count来观察一下递归40次的时候,此时count已经达到了一个非常大的次数。

         造成这种现象的原因可以通过以下图示来分析一下,以Fib(5)来举例子,我们发现,每一个Fib函数当参数没有达到1或者2的时候都要往下接着调用两次自身,所以计算的过程大致为2的次方的大小,这个数字每增加一就会乘二,增长速度很快。

         那么,为了解决如果数字比较大栈区溢出的问题,我们想到能否使用递归以外的方法完成这个数列的计算呢,于是我们想到了使用循环来解决这个问题。代码如下

int fib_no(int n)
{
	if (n <= 2)
		return 1;
	else
	{
		int first = 1;
		int second = 1;
		int third = 1;
		while (n > 2)
		{
			third = first + second;
			first = second;
			second = third;
			n--;
		}
		return second;
	}
}

         当n小于2的时候输出1,当n大于2的时候通过反复相加得到我们要的结果。

        完整代码如下所示

#include<stdio.h>
//1.斐波那契数列1 1 2 3 5 8 11
int count = 0;
int Fib(int n)
{
	count++;
	if (n <= 2)
		return 1;
	else
		return Fib(n - 1) + Fib(n - 2);
}
int Fib_no(int n)
{
	if (n <= 2)
		return 1;
	else
	{
		int first = 1;
		int second = 1;
		int third = 1;
		while (n > 2)
		{
			third = first + second;
			first = second;
			second = third;
			n--;
		}
		return second;
	}
}
int main()
{
	int num = 0;
	printf("num=");
	scanf("%d", &num);
	printf("Fib=%d\n Fib_no=%d\n", Fib(num),Fib_no(num));
	printf("count=%d", count);
	return 0;
}

 

三.斐波那契数列的类似问题——青蛙跳台阶问题

        与斐波那契数列相似的问题还有青蛙跳台阶的问题,问题描述如下

        一只小青蛙一次可以跳一个台阶或者两个台阶,给定一个台阶数,小青蛙跳完这个台阶总共有多少种跳法呢。

        对这个问题进行分解,与斐波那契数列有相似之处,不同点在于当num=2的时候有跳两次一个台阶和跳一次两个台阶的情况,所以返回值有所不同。

int Frog_step(int num)
{
	if (num ==1 || num==2)
	{
		return num;
	}
	else
	{
		return Frog_step(num - 1) + Frog_step(num - 2);
	}
}

        

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

荞麦壳枕头

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

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

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

打赏作者

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

抵扣说明:

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

余额充值