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

相关推荐
wuminyu1 小时前
专家视角看Java字节码加载与存储指令机制
java·linux·c语言·jvm·c++
万粉变现经纪人1 小时前
如何解决 pip install llama-cpp-python 报错 未安装 CMake/Ninja 或 CPU 不支持 AVX 问题
开发语言·python·开源·aigc·pip·ai写作·llama
清风明月一壶酒1 小时前
OpenClaw自动处理Word文档全流程
开发语言·c#·word
其实防守也摸鱼2 小时前
CTF密码学综合教学指南--第五章
开发语言·网络·笔记·python·安全·网络安全·密码学
Navigator_Z2 小时前
LeetCode //C - 1033. Moving Stones Until Consecutive
c语言·算法·leetcode
小郑加油3 小时前
python学习Day12:pandas安装与实际运用
开发语言·python·学习
AC赳赳老秦3 小时前
投标合规提效:用 OpenClaw 实现标书 / 合同自动审核、关键词校验、格式优化,降低废标风险
开发语言·前端·python·eclipse·emacs·deepseek·openclaw
KuaCpp3 小时前
C++面向对象(速过复习版)
开发语言·c++
wbs_scy3 小时前
Linux线程同步与互斥(三):线程同步深度解析之POSIX 信号量与环形队列生产者消费者模型,从原理到源码彻底吃透
java·开发语言
2zcode3 小时前
基于MATLAB元胞自动机(CA)的AZ80A镁合金动态再结晶(DRX)过程模拟
开发语言·matlab·动态再结晶