Рекурсия по лестнице
Я пытаюсь понять решение, представленное в книге, на следующий вопрос:
«Ребенок бежит вверх по лестнице с 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); }
Зачем? В чем проблема с множеством лестниц, созданных классом?
Благодарю.
(Примечание: книга взломает интервью)