首页 > 其他分享 >青蛙跳台阶问题

青蛙跳台阶问题

时间:2023-09-06 16:00:50浏览次数:32  
标签:return int 青蛙 跳法 times 问题 台阶 else

(青蛙跳台阶问题)

题目描述

一只青蛙可以一次跳1级台阶或一次跳2级台阶,例如:跳上第一级台阶只有一种跳法:直接跳1级即可。跳上两级台阶,有两种跳法:每次跳1级,跳两次;或者一次跳2级.问要跳上第级台阶有多少种跳法?

问题分析

  • 有一个台阶时:青蛙只能一级台阶,跳法一种 在这里插入图片描述

  • 有2个台阶时:青蛙可以一次跳2级台阶,也可以跳2次一级台阶,所以跳法两种: 在这里插入图片描述

  • 当有三级台阶时,如果青蛙第一次跳一级台阶,那么之后它就有两级台阶需要跳;如果第一次跳2级台阶,那么那之后就有1级台阶需要跳。这就把问题抛到了跳一级台阶和跳两级台阶的问题上,所以有3种跳法

第一次跳1级:在这里插入图片描述 第一次跳2级:在这里插入图片描述

  • 所以,当有n级台阶时,就可以把问题抛到n-1级台阶和n-2级台阶问题中,而这两个问题还可以细分,所以我们自然而然容易想到递归

第一次跳1级:在这里插入图片描述 第一次跳2级:

设跳n级台阶跳法为f(n)次 n = 1时,f(n) = 1; n = 2时,f(n) = 2; n>=3时,f(n) = f(n-1)+f(n-2);

递归解法

代码:

#include <stdio.h>
int times(int n)
{
	if (n == 1)
	{
		return 1;
	}
	else if (n ==2)
	{
		return 2;
	}
	else
	{
		return times(n - 1) + times(n - 2);
	}
}

int main()
{
	int n = 0;
	scanf("%d", &n);
	int time = times(n);
	printf("跳%d个台阶,需要%d次\n", n, time);
	return 0;
}

非递归解法

在前面的分析可以发现,n>=3时,f(n) = f(n-1)+f(n-2),也就是前n阶的前两种情况 所以完全可以使用非递归的循环语句解决这个问题

int times2(int n)
{
	if (n == 1)
	{
		return 1;
	}
	if (n == 2)
	{
		return 2;
	}
	else
	{
		int a = 1;   //一阶台阶有1中跳法
		int b = 2;   //二阶台阶有2种跳法
		int c = 0;  
		while (n > 2)
		{
			c = a + b;  
			a = b;
			b = c;
			n--;
		}
		return c;
	}
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	int time2 = times2(n);
	printf("跳%d个台阶,需要%d次\n", n, time2);
	return 0;
}

这里用动图解释过程请添加图片描述

全部代码

#include <stdio.h>
int times(int n)
{
	if (n == 1)
	{
		return 1;
	}
	else if (n ==2)
	{
		return 2;
	}
	else
	{
		return times(n - 1) + times(n - 2);
	}
}

int times2(int n)
{
	if (n == 1)
	{
		return 1;
	}
	if (n == 2)
	{
		return 2;
	}
	else
	{
		int a = 1;
		int b = 2;
		int c = 0;
		while (n > 2)
		{
			c = a + b;
			a = b;
			b = c;
			n--;
		}
		return c;
	}
}

int main()
{
	int n = 0;
	scanf("%d", &n);
	int time = times(n);
	printf("递归:跳%d个台阶,需要%d次\n", n, time); 
	int time2 = times2(n);
	printf("非递归:跳%d个台阶,需要%d次\n", n, time2);
	return 0;
}

测试结果: 在这里插入图片描述

标签:return,int,青蛙,跳法,times,问题,台阶,else
From: https://blog.51cto.com/u_16237630/7387987

相关文章

  • 使用Nodejs的addon导入cpp生成的dll时出现的问题记录
    在使用Nodejs的addon导入自己编写的cpp的dll时出现的一系列问题记录标签:__declspec、Napi、LoadLibraryA、GetLastError、dumpbin/exports。正常创建一个使用Napi的nodejsaddon项目(网上都有,在这里不赘述),主要代码如下:#include<napi.h>#include<iostream>#include<atlst......
  • 借助html2canvas下载图片,有滚动条的情况显示不全的问题
    我自己的遇到的情况是将页面的一个小窗口里边的内容生成图片下载,试了网上搜到的几个方法都没有生效,最后自己用了个取巧的方法:通过调整overflow-y来解决这个问题。downloadItem(){consttargetDom=document.getElementById(`image-${this.dialogNo}`)targetDo......
  • mysql常见问题
    1 ERROR2059(HY000):Authenticationplugin'caching_sha2_password'cannotbeloaded: linux上连接docker上面的mysql,安装客户端:sudoyuminstallmysql设置环境变量:exportPATH=$PATH:/path/to/mysql/bin使用root用户登录ALTERUSER'your_username'IDENTIFIED......
  • 二分的边界问题
    二分法的适用场景1.有单调性的题目一定可以二分2.没有单调性也有可能二分由此可见,二分的核心并不是单调性。核心是:定义了某种性质,使得可以将整个数据集一分为二,左半边满足一种性质,右半边不满足;右半边满足另一种性质,左半边不满足。则二分可以寻找左区间的边界,也可以寻找右区......
  • 三维模型OBJ格式轻量化的跨平台兼容性问题分析
    三维模型OBJ格式轻量化的跨平台兼容性问题分析 三维模型的OBJ格式轻量化在跨平台兼容性方面具有重要意义,可以确保模型在不同平台和设备上的正确加载和渲染。本文将分析OBJ格式轻量化的跨平台兼容性技术,并探讨其在保证数据一致性、支持多种平台和工具以及提供灵活性方面的作用......
  • 启动问题
    C:\Users\Administrator\AppData\Local\JetBrains\IntelliJIdea2022.1\external_build_system\csht-vue-master.a9def87c\project\compiler.xmlFailedtoloadprojectconfiguration:cannotreadfileC:\Users\Administrator\AppData\Local\JetBrains\Int......
  • 莫名显示的【Create event...】菜单问题
    问题现象:开发的程序在英语环境下,选择时间控件内的文本,按Ctrl+C时,会弹出一个【Createevent...】菜单(如下图)。 问题原因:WIN11的新功能。电脑在安装了日历APP后,选择当前日期之后的时间时,会弹出此菜单(仅支持北美)。可以让用户创建相应的日程计划。相应的功能说明:https://support.......
  • 用navicat工具excel导入数据到Oracle数据库,数字类型的总是多加.0的问题怎么处理
    在使用Navicat工具将Excel数据导入Oracle数据库时,数字类型的总是多加一个.0的问题可能与数据类型映射有关。您可以尝试以下解决方法:检查Excel列的数据格式:确保Excel列中的数据是按照数字格式存储,而不是文本或其他格式。如果列的单元格格式为文本,则导入时Oracle可能将......
  • 完全背包问题
    完全背包问题思路:f[i][j]=f[i-1][j-k*v[i]]+k*w[i]朴素版的做法#include<iostream>#include<algorithm>usingnamespacestd;constintN=1010;intn,m;intv[N],w[N];intf[N][N];intmain(){cin>>n>>m;for(inti......
  • AcWing 3. 完全背包问题
    题目有$N$种物品和一个容量是$V$的背包,每种物品都有无限件可用。第i$种物品的体积是$v_i$,价值是$w_i$。求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。输出最大价值。输入格式第一行两个整数,$N,V$,用空格隔开,分别表示物品种数和背包容积。......