(请先看置顶博文)本博打开方式,请详读_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;elsereturn 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;elsereturn 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、列举情况并细心观察