如何将for循环转换为递归方法?

时间:2012-10-20 03:37:31

标签: python loops recursion

目前,我将for循环实现为递归方法。

for i in range(len(list)):
   **implementation code goes here**

如何将其作为递归方法实现?

我打算浏览一个列表,检查每个项目是否在另一个已接受的可能值列表中。如果是这样,我会采取某些行动。否则,我会采取其他行动。

2 个答案:

答案 0 :(得分:5)

标准结构递归公式(以及使用像Scheme这样的函数式语言时使用的公式)将以递归方式解构列表:

func([]) => nothing
func([x, ...]) => 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]]

(当然,你可以在Python中做l[::-1],但在这里我们试图说明如何以递归方式完成。

答案 1 :(得分:1)

所以你想要取消一个好的(大多数)编码良好的循环? (主要是因为你可能想要使用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)

请注意,我无法想到 ANY 为什么要在实际代码中执行此操作的原因(但是,如果您只是这样做以自学有关递归的话,那么我希望这有帮助)。