Во-первых, я должен сказать, что даже после редактирования ваш код по-прежнему имеет неправильный отступ: return mem[i]
не должен быть без изменений.
Среди операций списка «+» означает конкатенацию, «*» означает повторение, поэтому [0,1]+[-1]*(n-1)
означает список: [0, 1, -1, ..., -1] (полностью (n-1) отрицательный 1).
Больше объяснения:
Список [0, 1, -1, ..., -1]
магазины, рассчитанные последовательности Фибоначчи (запоминанием). Первоначально он содержит только два допустимых значения: 0 и 1, все элементы «-1» означают, что последовательность в этом индексе еще не была вычислена. Эта записка передается как второй параметр для функции fib_mem_helper
. Если номер фибоначчи указанного индекса (например, i
) не был вычислен (если у mem[i] == -1
), fib_mem_helper
рекурсивно вычислит его и сохранит его до mem[i]
. Если он был вычислен, просто вернитесь из записки, не переучивая.
Вот и вся история.
Заключительное слово:
Этот код не достаточно эффективно, хотя это требует использования запоминания. Фактически, он создает новый список каждый раз, когда вызывается fib_mem
. Например, если вы дважды вызываете fib_mem(8)
, второй вызов по-прежнему должен воссоздать список и повторно пересчитать все заново. Причина в том, что вы храните записку внутри с объемом fib_mem
. Чтобы исправить это, вы можете сохранить памятку в виде словаря, который находится за пределами fib_mem
.
Отступ в коде очень важен для python, поэтому, пожалуйста, скопируйте код в подходящем отступе, а также ";" символ не используется в конце строки. – eLRuLL
Пожалуйста, позаботьтесь, указав правильный код. Гораздо сложнее помочь, если это не так. (В этом случае это означает, что вы получите правильное отступы и другой синтаксис, например ':', а не ';' для 'def' и' if' операторов.) –