C语言青蛙跳台阶问题

1.题目

一只青蛙跳一次只能跳1级台阶或跳2级台阶
求:该青蛙跳上第n级台阶总共有多少种跳法
例如:青蛙想跳至第二级台阶可以有两种跳法,一种是先跳一级再跳一级,另一种是直接跳两级台阶

2.分析与设计

2.1题目分析

题目中最关键的点是青蛙一次可跳1级台阶或2级台阶 ,根据这个点可以通过简单画图来求出一个规律性,设青蛙要跳上n级台阶,设func(n)为跳上n级台阶的跳法

可以得到以下的规律

2.2代码设计思路

青蛙有两种跳法,一种是跳到一级台阶,一种是跳上二级台阶
当n=1时:

  • 只有一种跳法

当n=2时:

  • 1.一级一级跳
  • 2.另一种直接跳两级

当n=3时:

  • 1.假设是先跳上一级台阶,那么剩下两级台阶,就是func(2)种跳法
  • 2.假设是先跳上两级台阶,那么剩下一级台阶,就是func(1)种跳法
  • 即func(3)=func(2)+func(1)

当n=4时:

  • 1.假设先跳上一级台阶,剩下三级台阶,就是func(3)种跳法
  • 2.假设先跳上两级台阶,剩下两级台阶,就是func(2)种跳法
  • 即func(4)=func(3)+fun(2)

以此类推
当n级台阶时,func(n)=func(n-1)+func(n-2)

3. 代码实现

3.1递归

c 复制代码
#include<stdio.h>
 
int func(int n)
{
	if (n == 1)
		return 1;
	else if (n == 2)
		return 2;
	else
		return func1(n - 1) + func1(n - 2);
}
 
int main()
{
	int n = 0;
	scanf("%d", &n);
	int ret = func(n);
	printf("func(%d)=%d\n", n, ret);
 
	return 0;
}

运行结果

画图推导

解释

c 复制代码
func(4)=func(3)+func(2)
=func(2)+func(1)+func(2)
=func(2)+func(1)+2
=2+1+2
=5

3.2非递归

可以看到上面递归的方法进行了大量重复运算,当数值不太大的时候就会运算很久,因此可以使用非递归方法,避免大量重复计算,从而提高代码效率

c 复制代码
#include<stdio.h>
 
int func(int n)
{
	int a = 1;
	int b = 2;
	int c = 0;
 
	if (n == 1)
		return a;
	else if (n == 2)
		return b;
	else
	{
		while (n - 2)
		{
			c = a + b;
			a = b;
			b = c;
			n--;
		}
		return c;
	}
}
 
int main()
{
	int n = 0;
	scanf("%d", &n);
	int ret = func(n);
	printf("func(%d)=%d\n", n, ret);
 
	return 0;
}

运行结果

画图推导

可以看出,当n>2时,循环进行n-2次,每一次循环结束,n--, 直到n-2=0跳出循环,返回结果

相关推荐
赤秀18 分钟前
C++模板初阶
开发语言·c++
JCBP_27 分钟前
数据结构4
运维·c语言·数据结构·vscode
AdrichPro35 分钟前
10、Linux C 网络编程(完整版)
linux·服务器·c语言·网络
橘猫云计算机设计40 分钟前
基于JavaWeb的二手图书交易系统(源码+lw+部署文档+讲解),源码可白嫖!
java·开发语言·前端·毕业设计·php
半桔41 分钟前
红黑树剖析
c语言·开发语言·数据结构·c++·后端·算法
江烽渔火1 小时前
C++ 多态
开发语言·c++
m0_490240671 小时前
软件自动化测试(1):python+selenium自动化测试环境搭建
开发语言·python·selenium
2401_858286111 小时前
CD21.【C++ Dev】类和对象(12) 流插入运算符的重载
开发语言·c++·算法·类和对象·运算符重载
上理考研周导师1 小时前
【虚拟仪器技术】Labview虚拟仪器技术应用教程习题参考答案[13页]
服务器·开发语言
ty_sj2 小时前
【FreeRtos】任务调度器可以被挂起吗?
c语言·嵌入式硬件