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

题目大意:王老师爬楼梯,他可以每次走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、列举情况并细心观察

发布了62 篇原创文章 · 获赞 93 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/GenuineMonster/article/details/88837916
今日推荐