memo = [0] * (n+1)
: Я понял, что это массив, но как здесь хранятся значения, как он инициализируется?
Когда вы умножаете одноэлементный список на целое число в Python, он инициализирует список тем повторяющимся элементом, сколько бы вы ни указали. Например, для n=5
:
memo = [0] * (n+1)
инициализирует список 6 0
с и присваивает его переменной memo
.
>>> n = 5
>>> memo = [0] * (n+1)
>>> memo
[0, 0, 0, 0, 0, 0]
Имейте в виду, что этот метод инициализации списков прекрасно работает для списков неизменяемых объектов (булевых, чисел, строк и т. Д.), Но не очень хорошо работает для изменяемых объектов (например, списков списков или списков словарей) , Это потому, что Python добавляет n
копии того же самого объекта в список, что обычно не то, что вам нужно. (Когда вы пытаетесь изменить один из изменяемых объектов в ваших списках, все они изменятся, поскольку все они являются просто копиями одного и того же объекта.)
for i in range(2, n+1)
:: почему он зацикливается до n + 1, не должен ли он быть до n только?
Он останавливается на n
, поскольку это встроенное поведение функции range
. Когда вы передаете два аргумента, они являются его значениями start
и stop
. Функция range
возвращает последовательность от start
(включительно) до stop
(исключая).
Если бы вместо этого вы сказали range(2, n)
, он остановился бы на n-1
. (Еще один способ думать об этом - добавление 1 к n
- это то, что останавливает его на n
.)