#python #recursion
#python #рекурсия
Вопрос:
def cube_of(valz):
'''Returns the cube of values'''
if len(valz) == 0:
return 0
else:
new_val = [valz[0] ** 3]
return [new_val] [cube_of(valz[1:])]
Итак, я создаю эту функцию для демонстрации, которая принимает список вызываемых значений valz
и принимает куб каждого значения, а затем возвращает список этих кубов.
Например, допустим, ввод [-1,2,-3,4,-5]
— он должен возвращаться [-1,8,-27,64,-125]
, но он возвращается [-1, [8, [-27, [64, [-125, 0]]]]]
. Что вызывает дополнительные скобки? Если я удаляю скобки в коде, то он либо выдает сумму этих кубов (что неверно), либо выдает ошибку (что-то о добавлении an int
к a list
). Я попытался отладить это и даже попросил моего друга взглянуть, но мы оба в тупике.
Комментарии:
1. Возникли проблемы с форматированием на мобильном устройстве :/
2. добавьте 4 пробела перед каждой строкой кода, чтобы правильно отформатировать его в SO.
3. Да, кому-то удалось отредактировать форматирование для меня, но я не знал, что это возможно, спасибо!
Ответ №1:
cube_of(valz[1:])
это уже список. Нет необходимости заключать это в скобки.
return [new_val] cube_of(valz[1:])
Ответ №2:
Если valz
пусто, вы должны вернуть пустой список вместо 0
— return []
new_valz
это список, поэтому вам не нужны скобки. cube_of
возвращает список, поэтому вам тоже не нужны скобки.
def cube_of(valz):
'''Returns the cube of values'''
if len(valz) == 0:
return []
else:
new_val = [valz[0] ** 3]
return new_val cube_of(valz[1:])
cube_of([-1,2,-3,4,-5])
# [-1,8,-27,64,-125]
cube_of([])
# []
Комментарии:
1. Спасибо, добрый сэр! Довольно неприятно, что я все время был в двух скобках от решения, но теперь я его получил! Большое спасибо. Должен ли я поставить галочку, чтобы указать ваше решение в качестве решения?
Ответ №3:
Ваш код может быть упрощен
используя понимание списка:
def cube_of(valz):
return [item**3 for item in valz]
Рекурсивный подход:
def cube_of(valz):
return [valz[0]**3] cube_of(valz[1:]) if valz else []
Пример запуска:
>>> cube_of([-1,2,-3,4,-5])
[-1, 8, -27, 64, -125]
Комментарии:
1. К сожалению, эта демонстрация посвящена рекурсии. Понимание списка было бы намного проще :/
2. @Jawndoyghoi1569: Никаких проблем. Рекурсивный подход также проще. Программа обновления также отвечает на этот вопрос 🙂
Ответ №4:
cube_of(valz)
уже возвращает начальный сегмент списка в else
части ветки, т. Е. [new_val]
. Поэтому, чтобы его общее возвращаемое значение было типа list , оно должно возвращать списки во всех своих ветвях.
Вы должны изменить функцию следующим образом:
def cube_of(valz):
'''Returns the cube of values'''
if len(valz) == 0:
return []
else:
new_val = [valz[0] ** 3]
return [new_val] cube_of(valz[1:])
Обратите внимание, что теперь, поскольку обе ветви if-else возвращают начальный сегмент конечного списка, cube_of
сам теперь возвращает список по индукции, тем самым заставляя весь рекурсивный вызов возвращать значение типа list .
Однако, если вы ищете элегантное и более идиоматическое / питоновское решение, смотрите не дальше, чем anonymous ‘.