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跳出循环,返回结果

相关推荐
luteres1 小时前
Mybatis+SSM整合笔记
java·开发语言·mybatis
郝学胜-神的一滴1 小时前
《C++11 工程级应用01:告别冗长类型,开启简洁高效编码新时代》深度解读
开发语言·c++·算法·软件开发·系统设计
其实防守也摸鱼1 小时前
推荐一个自动化教育SRC漏洞挖掘系统--AutoHunter
运维·开发语言·人工智能·学习·安全·web安全·自动化
kkkkkkkkkk_Z8 小时前
学嵌入式和C语言编程数据结构|学习日记Day22:栈,二叉树,哈希存储
c语言·数据结构·学习
覆东流8 小时前
7.Java数组
java·开发语言·后端
Navigator_Z8 小时前
LeetCode //C - 1206. Design Skiplist
c语言·算法·leetcode
码行山野赴时序归途8 小时前
三道经典数组题:从暴力到最优的算法思维
c语言·开发语言·数据结构·算法·leetcode
lzhdim8 小时前
提高 SQL 语句执行速度的方法
java·开发语言·数据库·sql·oracle
JavaPub-rodert8 小时前
王仕宇在 Go Context 如何解决协程泄漏与超时控制
开发语言·后端·golang·iphone·javapub·王仕宇
ly768910 小时前
JavaScript 从入门到进阶:核心语法、异步编程与工程化实践
开发语言·javascript·ecmascript