c++爬楼梯递归问题

C++ Stair Climber Recursion Issue?

本文关键字:问题 递归 爬楼 c++      更新时间:2023-10-16

目标是编写一个程序,计算并打印一个人每次爬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. [1, 2]

  3. (2, 1)
  4. [3]

实际输出->

  1. [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中最后推入的元素。这是你在回溯时应该始终遵守的一条常见规则——始终将对象恢复到它在递归调用之前的状态。