1

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

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

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

我计划浏览一个列表,检查每个项目是否在另一个可接受的可能值列表中。如果是这样,我会对其执行某些操作。否则,我会执行其他操作。

4

2 回答 2

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]]

(当然,你可以只l[::-1]用 Python 做,但在这里我们试图展示它是如何递归完成的)。

于 2012-10-20T03:54:52.107 回答
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)

请注意,我想不出您为什么要在实际代码中执行此操作的任何原因,(但是,如果您这样做只是为了自学递归,那么我希望这会有所帮助)。

于 2012-10-20T03:43:25.643 回答