1、2 或 3 步爬楼梯的方式数量 - 记忆

Number of ways in which you can climb a staircase with 1, 2 or 3 steps - memoization

我必须计算一个人一次走 1 步、2 步或 3 步爬楼梯的方式有多少种。我知道如何做到这一点,例如 f(n-1) + f(n-2) + f(n-3) 但我想知道为什么在我的实现中(与上述不同)我没有得到正确的答案。我正在使用 for 循环。 问题是每次返回一个非零值但该值包含一个预先计算的答案,因此我的代码不使用。我需要做哪些改变?

#include <iostream>
#include <map>

using namespace std;
int nWays = 0;

int stepPerms(int n, map<int, int> &memo) {

    if (memo.find(n) != memo.end())
        return memo[n];
    if (n == 0)
        return 0;
    if (n < 0)
        return -1;
    for (int i = 1; i <= 3; i++) {
        int retVal = stepPerms(n - i, memo);
        if (retVal == 0)
            memo[n] = ++nWays;
    }
    return memo[n];
}

int main() {
    map<int, int> memo;
    cout << stepPerms(5, memo);//cout << stepPerms(3) << endl;
}

我是这样解决的:

#include <iostream>
#include <map>

using namespace std;
map<int, int> memo;

int stepPerms(int n) {
    if (memo.find(n) != memo.end())
        return memo[n];
    if (n == 0)
        return 0;
    if (n == 1)
        return 1;
    if (n == 2)
        return 2;
    if (n == 3)
        return 4;
    for (int i = 1; i <= 3; i++)
        memo[n] += stepPerms(n - i);
    return memo[n];
}

int main() {
    cout << stepPerms(27);
}