#python #recursion
Вопрос:
В настоящее время я реализую цикл for как рекурсивный метод.
for i in range(len(list)): **implementation code goes here**
как мне реализовать это как рекурсивный метод?
Я планирую просмотреть список, проверяя, находится ли каждый элемент в другом списке допустимых возможных значений. Если это так, я выполняю определенные действия с ним. В противном случае я совершаю другие действия.
Комментарии:
1. Я только что отредактировал его сейчас. 🙂
2. Да, я тоже изменил вопрос. ЛОЛ
3. Что вы планируете делать в цикле? На самом деле нет смысла повторять, если вы ничего не делаете …
4. Просто чтобы подтвердить, что я рассматриваю только 1 цикл — Просто проясняю это.
5. Тогда что вы хотите сделать в этом цикле? Мы не сможем преобразовать, пока не узнаем, для чего предназначен этот цикл.
Ответ №1:
Стандартная структурная рекурсивная формула (и та, которую вы использовали бы, если бы использовали функциональный язык, подобный Scheme), заключалась бы в рекурсивной деконструкции списка:
func([]) =gt; nothing func([x, ...]) =gt; do_stuff(x), func([...])
Поэтому «функциональный» способ сделать это-взять один список (не индекс) и выполнить рекурсию в меньших списках:
def rec_list(l): if not l: return # empty list case # process l[0] return rec_list(l[1:])
Обратите внимание, что это ужасно , ужасно неэффективно из-за l[1:]
, но это основа для понимания более сложных рекурсивных конструкций (например, рекурсии на двоичных деревьях).
Мы можем делать интересные вещи с помощью такого рода структурной рекурсии. Например, вот как вы бы перевернули список на функциональном языке:
def rev_list(l): if not l: return [] return rev_list(l[1:]) [l[0]]
(Конечно, вы могли бы просто сделать l[::-1]
это на Python, но здесь мы пытаемся показать, как это будет сделано рекурсивно).
Комментарии:
1. Интересно, стоит ли создавать класс «нарезанная последовательность», чтобы эффективно поддерживать это…
2. Обратите внимание, что это рекурсивно повторяет элементы в списке, а не индексы, как в примере кода операции. Тем не менее, это очень хорошее объяснение (я сам не часто использую функциональные языки, поэтому интересно увидеть новый способ делать эти вещи). 1 от меня.
3. @IgnacioVazquez-Абрамс: Я всегда думал, что было бы неплохо иметь такую функцию в Python, хотя добавление слишком большого количества «ленивых» функций может немного усложнить задачу. У Numpy’s
array
есть ленивая нарезка (l[1:]
возвращает представление), так что вы могли бы это использовать.
Ответ №2:
Итак, вы хотите покончить с хорошим (в основном) хорошо закодированным циклом? (в основном потому, что вы, вероятно, хотите использовать enumerate
вместо range(len(lst))
) — enumerate
довольно круто, как только вы начнете его использовать, вы никогда не оглянетесь назад.
В любом случае, я думаю, мы можем это сделать:
def silly_loop(lst,index=0): try: #do something with index and lst here silly_loop(lst,index=index 1) except IndexError: #or maybe a different error, depending on what you're doing with index ... return
пример:
def silly_loop(lst,index=0): try: print lst[index] silly_loop(lst,index=index 1) except IndexError: return a = range(10) silly_loop(a)
Обратите внимание, что я не могу придумать НИКАКОЙ причины, по которой вы хотели бы сделать это в реальном коде (но если вы делаете это просто для того, чтобы научиться рекурсии, то я надеюсь, что это поможет).
Комментарии:
1. Я думаю, что совершенно очевидно, что это учебное упражнение. Также нет причин быть таким покровительственным.
2. @QuickJoeSmith — я не пытаюсь быть снисходительным. Не очевидно, что это просто учебное упражнение. Я видел много просьб от людей, пытающихся делать некоторые довольно странные вещи, потому что они не знали лучше. (Возможно, они читали о том, насколько удивительна рекурсия, и думали, что это решит все их проблемы …) Я написал пост таким образом, чтобы убедиться, что OP понимает, что это не идиоматический python и его не следует использовать в реальном коде. В любом случае, вы, возможно, правы, что я, возможно, перестарался. Я попытался немного смягчить это. Как ты думаешь, так будет лучше?