C语言(CED)王老师爬楼梯,他可以每次走1级或者2级,输入楼梯的级数,求不同的走法数(递归求解)

(请先看置顶博文)本博打开方式,请详读_liO_Oil的博客-CSDN博客_怎么把androidstudio卸载干净

题目大意:王老师爬楼梯,他可以每次走1级或者2级,输入楼梯的级数,求不同的走法数。例如:楼梯一共有3级,他可以每次都走一级,或者第一次走一级,第二次走两级也可以第一次走两级,第二次走一级,一共3种方法。编写一个程序,要求输入楼层,输出王老师上楼的方法总数。

一、大致思路

这道题其实之前大家都有接触过,这道题目的解法也很多,今天要介绍的是递归解法。

我们先把n=1,n=2,n=3,n=4,n=5的情况列举出来,发现,有一个规律,那就是我们常见的斐波那契数列的规律。既然已经发现这个规律,那么就对其进行分类,并递归解决问题。为了让大多数检验结果能顺利输出,在此,运用long大数定义。(因为题目简单,所以就没有在思路上多加叙述,如若不解,还请留言!很喜欢与大家交流学习)

二、具体实现

#include<iostream>
#include<cmath>
using namespace std;
long long calculate(int n)//用long long定义,整形范围更大
{
	long long a[100] = { 0 };
	a[0] = 1;//根据逻辑推理得出,所要求的方法数是前两个的和。
	a[1] = 2;//同上
	if (n == 1)
		return 1;
	else if (n == 2)
		return 2;
	else
		return calculate(n - 1) + calculate(n - 2);//递归求解
}
int main()
{
	int n;
	cout << "请输入上楼的楼梯数:" << endl;
	while (cin >> n)
	{
		if (n == 0)
		{
			cout << "输入有误,请重新输入!" << endl;
			continue;
		}
		cout << "对应的走法有:" << endl;
		cout << calculate(n) << endl;
		cout << "王老师已成功上楼!" << endl;
		cout << "请输入下一上楼的楼梯数:(无其他输入请按EOF结束)" << endl;
	}
	return 0;
}

那么突发奇想,要是王老师每次走1级或者2级或者3级呢?这样该如何求解呢?

愚拙的我将1-6的方法种类全部列出,发现了这个规律:

calculate(n)=calculate(n-1)+calculate(n-2)+calculate(n-3)。

如下图所示:(我的字不是下面这样的)

二、具体实现

#include<iostream>
#include<cmath>
using namespace std;
long long calculate(int n)//用long long定义,整形范围更大
{
	long long a[100] = { 0 };
	a[0] = 1;//根据逻辑推理得出,所要求的方法数是前三个的和。
	a[1] = 2;//同上
	a[3] = 4;//同上
	if (n == 1)
		return 1;
	else if (n == 2)
		return 2;
	else if (n == 3)
		return 4;
	else
		return calculate(n - 1) + calculate(n - 2) + calculate(n - 3);//递归求解
}
int main()
{
	int n;
	cout << "请输入上楼的楼梯数:" << endl;
	while (cin >> n)
	{
		if (n == 0)
		{
			cout << "输入有误,请重新输入!" << endl;
			continue;
		}
		cout << "对应的走法有:" << endl;
		cout << calculate(n) << endl;
		cout << "王老师已成功上楼!" << endl;
		cout << "请输入下一上楼的楼梯数:(无其他输入请按EOF结束)" << endl;
	}
	return 0;
}

解决题目的前提:

1、理解题意

2、列举情况并细心观察

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liO_Oil

打赏我,开启隐藏模式。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值