c++爬楼梯递归问题
C++ Stair Climber Recursion Issue?
目标是编写一个程序,计算并打印一个人每次爬1、2或3级楼梯时爬n级楼梯的所有不同方式。
我的递归算法有一个小问题:
#include <iostream>
#include <vector>
#include <algorithm>
#include <sstream>
#include <iomanip>
using namespace std;ctor< vector<int> > outer;
vector<int> inner;
vector< vector<int> > get_ways(int num_stairs) {
// TODO: Return a vector of vectors of ints representing
// the different combinations of ways to climb num_stairs
// stairs, moving up either 1, 2, or 3 stairs at a time.
if (num_stairs <= 0) {
outer.push_back(inner);
inner.clear();
}
if (num_stairs >= 1) {
inner.push_back(1);
get_ways(num_stairs-1);
}
if (num_stairs >= 2) {
inner.push_back(2);
get_ways(num_stairs-2);
}
if (num_stairs >= 3) {
inner.push_back(3);
get_ways(num_stairs-3);
}
return outer;
}
void display_ways(const vector< vector<int> > &ways) {
for (unsigned int i = 0; i < ways.size(); i++) {
cout << i+1 << ". " << "[";
for (unsigned int j = 0; j < ways[i].size(); j++) {
if (j != ways[i].size()-1)
cout << ways[i][j] << ", ";
else
cout << ways[i][j];
}
cout << "]" << endl;
}
}
错误示例:
get_ways (3)
期望输出->
[1,1,1]
[1, 2]
(2, 1) - [3]
实际输出->
- [1,1,1]
//如果递归碰到多个if语句,算法不打印前面的15 ?
2。[2]
- (2, 1)
- [3]
任何帮助都非常感谢!
实际代码应该是:
vector< vector<int> > get_ways(int num_stairs) {
if (num_stairs <= 0) {
outer.push_back(inner);
}
if (num_stairs >= 1) {
inner.push_back(1);
get_ways(num_stairs-1);
inner.pop_back();
}
if (num_stairs >= 2) {
inner.push_back(2);
get_ways(num_stairs-2);
inner.pop_back();
}
if (num_stairs >= 3) {
inner.push_back(3);
get_ways(num_stairs-3);
inner.pop_back();
}
return outer;
}
为什么你的代码不正确?让我们跟踪函数堆栈和向量inner
:
Function stack inner
get_way(3) []
get_way(2) [1]
get_ways(1) [1,1]
get_ways(0) [1,1,1] (*)
get_ways(0) [2]
....
在点(*)清除inner
,在get_ways(2)
执行的下一步,您将获得矢量[2]
而不是[1, 2]
。因此,在完成递归调用后,不应该清除inner
,而应该弹出在inner
中最后推入的元素。这是你在回溯时应该始终遵守的一条常见规则——始终将对象恢复到它在递归调用之前的状态。
相关文章:
- 到连接组件算法的问题(递归)
- 需要为 C++ 中的以下问题设计递归算法
- 棘手的按值传递和按引用递归问题传递
- C++删除/(递归)对象销毁问题
- 返回不停止函数,递归函数问题?(编程练习,动态规划,Levenshtein 回溯)
- 变分模板递归构造函数问题
- 跟踪递归函数时出现问题
- 我遇到了有关递归的堆栈问题
- 这个简单的 C++ 递归函数来反转字符串有什么问题?
- 递归回文问题的时间复杂度,C++
- 递归 Boost.Spirit 解析的问题
- 具有编译问题的简单(递归)可变参数模板"accumulate_for"函数
- 可变参数模板中递归模板函数的终止问题
- 递归布尔函数的问题
- 我的编辑距离递归代码中的字符类型有问题
- 优化递归问题以计算超级数字
- 我的链接列表反向递归方法的代码的问题是什么?
- 问题 - 递归函数以返回文本文件排列
- nqueens问题的C 递归解决方案无法正常工作
- 递归结构的向量有内存问题