c语言 青蛙上台阶问题

题目:青蛙上台阶

一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

思路:
青蛙如果跳一级台阶,则有一种跳法。跳二级台阶,则有两种跳法。跳三级台阶,则有三种跳法,跳四级台阶,则有五种跳法,跳五级台阶,则有八种跳法。

台阶数跳法
11
22
33
45
58

由结果很容易看出,这是一个斐波那契数列,满足当n>2时,第n个数等于第n-2个数与第n-1个数之和。也就是后面一个数等于前俩个数之和。因此该题也就有了多种解法,可以运用函数迭代的方法,也可以运用递归的方法,但此处运用递归会出现一些问题,具体问题自己可以去编译器去尝试一下,体验一下。

代码如下:
**利用函数迭代实现**
#include<stdio.h>
int fib(int n)
{
	int a=1;
	int b=1;
	int c=0;
	if (n < 2)
	{
		return 1;
	}
	while (n >= 2)
	{
		c = a + b;
		a = b;
		b = c;
		n--;
	}
	return c;

}
int main()
{
	int n;
	int num = 0;
	scanf("%d", &n);;
	num = fib(n);
	printf("有%d种跳法\n",num);

	return 0;
}
**利用递归实现**
(此道题不建议使用)
#include<stdio.h>
int fib(int n)
{
	if (n < 3)
	{
		return n;
	}
	else
	{
		return fib(n - 2) + fib(n - 1);
	}
}
int main()
{
	int n;
	int sum = 0;
	scanf("%d", &n);
	sum = fib(n);
	printf("有%d种跳法\n",sum);
	
	return 0;
}

此处用递归并不如运用函数迭代,因为此时递归处理数据较多,重复数据计算多次,使得计算结果出来的变慢,且计算结果容易出错。

**在这里我们可以看一下计算重复数据的次数**
#include<stdio.h>
int count = 0;
int fib(int n)
{
	if (n == 3)
		count++;
	if (n < 3)
	{
		return n;
	}
	else
	{
		return fib(n - 2) + fib(n - 1);
	}
}
int main()
{
	int n;
	int sum = 0;
	scanf("%d", &n);
	sum = fib(n);
	printf("有%d种跳法\n",sum);
	printf("count = %d\n", count);
	return 0;
}


通过结果可以看出,就仅仅计算第四十个数,第三个数就被计算了上千万次,并且计算结果时还耗费时间,且递归太深容易造成堆栈的溢出,计算结果并不能保证正确。

总结

递归的思路固然很棒,但并不是在任何情况下都是最优办法,有时运用递归反而会拖慢计算速度,所以运用递归之前要考虑解决对应问题时是否高效,但是递归这种思想一定要好好掌握。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值