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

相关推荐
祈安_3 天前
C语言内存函数
c语言·后端
郑州光合科技余经理4 天前
代码展示:PHP搭建海外版外卖系统源码解析
java·开发语言·前端·后端·系统架构·uni-app·php
feifeigo1234 天前
matlab画图工具
开发语言·matlab
dustcell.4 天前
haproxy七层代理
java·开发语言·前端
norlan_jame4 天前
C-PHY与D-PHY差异
c语言·开发语言
多恩Stone4 天前
【C++入门扫盲1】C++ 与 Python:类型、编译器/解释器与 CPU 的关系
开发语言·c++·人工智能·python·算法·3d·aigc
QQ4022054964 天前
Python+django+vue3预制菜半成品配菜平台
开发语言·python·django
czy87874754 天前
除了结构体之外,C语言中还有哪些其他方式可以模拟C++的面向对象编程特性
c语言
遥遥江上月4 天前
Node.js + Stagehand + Python 部署
开发语言·python·node.js
m0_531237174 天前
C语言-数组练习进阶
c语言·开发语言·算法