Шаг 125.
Рекурсия на Python.
Задачи подсчёта. Подъём по лестнице

    На этом шаге мы рассмотрим рекурсивное решение этой задачи.

    Цель следующей задачи - посчитать количество возможных способов подняться по лестнице из n ступенек с шагом в одну или две ступеньки. На рисунке 1 показан один из способов подъёма по лестнице из семи ступенек.


Рис.1. Один из способов подняться по лестнице с шагом в 1 или 2 ступеньки

    Понятно, что размер задачи - n. Рассмотрим несколько начальных условий. Если n = 1, то существует только один способ подняться по лестнице. Если n = 2, то можно сделать либо два шага, либо один (через ступеньку). Кроме того, если представлять способ подъёма списком, то можно также считать, что при n = 0 результатом будет пустой список.

    В исходной задаче (рисунок 2(а)) темная стрелка представляет общее количество способов f(n) подъёма по лестнице из n ступенек.


Рис.2. Декомпозиция задачи подсчёта всех способов подняться по лестнице с шагом в 1 или 2 ступеньки

    А сами способы подъёма можно разделить на две группы. Одна из них включает последовательность дальнейших шагов после одиночного шага. После одиночного шага будет ещё f(n - 1) способов добраться до вершины лестницы, делая одиночные или двойные шаги (рисунок 2(b)). Поэтому жирная стрелка представляет подзадачу размера n - 1. Во второй группе - дальнейшая последовательность шагов после двойного шага. В этом случае (рисунок 2(c)) количество способов подняться по лестнице будет f(n - 2), где жирная стрелка указывает на подзадачу размера n - 2. Наконец, поскольку обе группы последовательностей представляют общее количество способов подняться по лестнице, решение - f(n - 1) + f(n - 2). Вместе с начальными условиями функция может быть определена следующим образом:

              1,                     если n = 1,
    f(n, k) = 2,                     если n = 2,
              f (n - 1) + f (n - 2), если n ≥ 3
что очень напоминает функцию Фибоначчи F(n) (см. (1.2)), а точнее f(n) = F(n + 1).

    На следующем шаге мы рассмотрим путь по Манхэттену.




Предыдущий шаг Содержание Следующий шаг