Как преобразовать цикл for в рекурсивный метод?

#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 и его не следует использовать в реальном коде. В любом случае, вы, возможно, правы, что я, возможно, перестарался. Я попытался немного смягчить это. Как ты думаешь, так будет лучше?