#python #recursion #computer-science
#python #рекурсия #информатика
Вопрос:
Я новичок в рекурсии и нахожу ее довольно сложной для понимания. Я не могу понять, как добавить пустой массив, если я не могу напрямую «коснуться» его. Если это строка, я бы добавлял значение каждый раз. Если бы это было число, которое требовало умножения, я мог бы умножать его каждый раз, но с массивом я не знаю, что делать.
Я не знаю, как добавить к пустому массиву, не имея возможности напрямую «коснуться» его.
Это то, что я делал до сих пор:
def laugh(num):
if num == 0:
return []
# This doesnt work since we can't append a function call. I'm unsure what to do.
return laugh(num - 1).append("ha ")
print(laugh(3)) -> [«ha, ha, ha»]
Если бы я мог сделать это легко, если бы я мог просто вернуть строку «Ha»вместо этого. Я мог бы вернуть пустую строку и просто добавить «Ha» для каждого шага.
Комментарии:
1.
append
не возвращает новый объект, он изменяет существующий. Такreturn laugh.append()
что простоNone
2. Вы могли бы вернуть
laugh(num - 1) ["ha "]
Ответ №1:
Вы можете изменить его следующим образом:
def laugh(num):
if num == 0:
return []
haha = laugh(num-1)
haha.append("ha")
return haha
Поскольку append
не возвращает измененный список, вы должны сделать это в два этапа. Используя конкатенацию и тернарный оператор, вы можете уменьшить это до:
def laugh(num):
return laugh(num-1) ["ha"] if num else []
Ответ №2:
В этом случае вы изменяете список, вызывая append для него. Что вы хотите сделать, это вернуть новый список:
def laugh(num):
# base case
if num == 0:
return []
# recursive case
return ["ha"] laugh(num-1)
Комментарии:
1. Не могли бы вы объяснить, почему я возвращаю новый список? Я немного смущен? Поскольку базовый вариант вернет [] , который станет [] [«ha»] на следующем шаге. РЕДАКТИРОВАТЬ — О, я думаю, с помощью python вы можете добавлять списки в другой список для добавления ?!
2. Таким образом, это отличается от добавления одного списка в другой, потому что это мутация. Он создает новый список, который является результатом объединения двух списков без каких-либо изменений. Это похоже на (cons … пусто) в lisp или языке, основанном на лямбда-исчислении.