Рекурсия по лестнице

Я пытаюсь понять решение, представленное в книге, на следующий вопрос:

«Ребенок бежит вверх по лестнице с n шагами и может прыгать либо по 1 шагу, либо по 2 шагу, либо по 3 шагу за раз. Реализуйте метод, чтобы подсчитать, сколько возможных способов ребенок может пройти по лестнице».

Решение книги состоит в следующем, вытекающем из того факта, что «последним шагом может быть одношаговый переход из n - 1, двухшаговый переход из шага n - 2 или тройной скачок из шага n - 3»

public static int countWaysDP(int n, int[] map) {
    if (n < 0) 
        return 0;
    else if (n == 0)
        return 1;
    else if (map[n] > -1)
        return map[n];
    else {
        map[n] = countWaysDP(n - 1, map) + countWaysDP(n - 2, map) + countWaysDP(n - 3, map);
        return map[n]; }
}

Моя путаница заключается в следующем:

Почему программа должна возвращать 1, если число шагов равно нулю? То, как я думаю об этом, если количество шагов равно нулю, то есть ноль способов пройти по лестнице. Разве лучшим решением не было бы что-то вроде «если (n <= 0) вернуть 0; иначе, если (n == 1) вернуть 1»?

Я не уверен, что понимаю причину создания этого статического метода? Google говорит, что статический метод - это метод, который вызывается всем классом, а не объектом класса. Таким образом, намерение книги выглядит примерно так:

.

class Staircase {
    static int n;
public:
    static int countWaysDP(int n, int[] map); }

вместо:

class Staircase {
    int n;
public:
    int countWaysDP(int n, int[] map); }

Зачем? В чем проблема с множеством лестниц, созданных классом?

Благодарю.

(Примечание: книга взломает интервью)

Ответы на вопрос(4)

Ваш ответ на вопрос