假设你正在爬楼梯,需要n阶你才能到达楼顶,每次你可以爬1或2个台阶,你有多少种方法可以爬到楼顶?
注意:n是一个正整数。
实例1:
输入:2
输出:2
解释:有两种方法可以爬到楼顶
1.1阶+1阶
2.2阶
实例2:
输入:3
输出:3
解释:有三种方法可以爬到楼顶
1.1阶+1阶+1阶
2.1阶+2阶
3.2阶+1阶
该问题用公式可表示为:
f
(
n
)
=
{
1
n
=
1
2
n
=
2
f
(
n
−
1
)
+
f
(
n
−
2
)
n
≥
3
f(n)= \begin{cases} 1 \qquad \qquad \qquad \qquad \quad n=1\\ 2 \qquad \qquad \qquad \qquad \quad n=2 \\ f(n-1)+f(n-2) \quad n≥3\\ \end{cases}
f(n)=⎩
⎨
⎧1n=12n=2f(n−1)+f(n−2)n≥3
方法1:常规递归解法
int climbStairsWithRecursive(int n)
{
if(n == 1) return 1;
if(n == 2) return 2;
return climbStairsWithRecursive(n - 1) + climbStairsWithRecursive(n - 2);
}
方法2:优化后的递归解法
int climbStairsWithRecursive2(int n)
{
map<int, int> storeMap;
if (n == 1) return 1;
if (n == 2) return 2;
auto it = storeMap.find(n);
if (it != storeMap.end())
{
return it->second;
}
else {
int result = climbStairsWithRecursive(n - 1) + climbStairsWithRecursive(n - 2);
storeMap[n] = result;
return result;
}
}
方法3:循环解法,自底向上累加
int climbStairsWithRecursive3(int n)
{
if (n == 1) return 1;
if (n == 2) return 2;
int result = 0;
int pre = 2;
int prepre = 1;
for (int i = 3; i <= n; i++)
{
result = pre + prepre;
prepre = pre;
pre = result;
}
return result;
}
使用示例:
int main()
{
cout << "请输入楼梯阶数:"<< endl;
int n;
cin >> n;
int m = climbStairsWithRecursive(n); //方法1
int b = climbStairsWithRecursive2(n);//方法2
int c = climbStairsWithRecursive3(n);//方法3
cout << m << endl;
cout << b << endl;
cout << c << endl;
system("pause");
return 0;
}
输出结果: