Python 递归函数中的循环
对于某些算法,我发现定义如下所示的递归函数很方便:Python 递归函数中的循环,python,recursion,Python,Recursion,对于某些算法,我发现定义如下所示的递归函数很方便: def f(l): for i in range(2): if len(l)>=1: print(l+[i]) else: return f(l+[i]) f([0]) 但这种行为与我所期望的不同。它的作用是打印 [0, 0] [0, 1] 但我希望它能打印出来 [0,0] [0,1] [1,0] [1,1] 以某种方式,嵌套函数可以访问变量i,
def f(l):
for i in range(2):
if len(l)>=1:
print(l+[i])
else:
return f(l+[i])
f([0])
但这种行为与我所期望的不同。它的作用是打印
[0, 0]
[0, 1]
但我希望它能打印出来
[0,0]
[0,1]
[1,0]
[1,1]
以某种方式,嵌套函数可以访问变量i,而不是使用某个不同的变量启动新循环,它只是继续使用该变量i计数。我不明白Python为什么会这样做
因此,我(模糊的)问题是Python为什么要这样做,我的代码是否有一些明显的修改,可以提供我最初期望的输出?您的代码永远不会递归
for i in range(2):
if len([0])>=1:
print([0]+[i])
else:
return f([0]+[i])
# de-functified
第一次通过for
循环时,len([0])>=1
为True
,因此它打印[0]+[0]
。第二次通过for
循环,len([0])>=1
仍然是True
,因此它打印[0]+[1]
。然后循环结束,控制传递到函数外部。您永远不会到达递归案例(len(l)<1
)
请注意,您的预期结果只是:
import itertools
result = itertools.product(range(2), repeat=2) # cast to list if necessary
调试 让我们加入一点调试跟踪:
def f(l):
print ("ENTER:", l)
for i in range(2):
print("i=", i, "len(l)=", len(l))
if len(l)>=1:
print(l+[i])
else:
return f(l+[i])
print(f([0]))
输出:
ENTER: [0]
i= 0 len(l)= 1
[0, 0]
i= 1 len(l)= 1
[0, 1]
None
分析
使用一个元素列表调用函数。因此,len(l)是1。您在循环中同时使用if的“true”分支。请注意,您从不更改列表l。因此,您永远不会进行预期的递归调用
修理
我无法为您解决此问题,因为您尚未解释您期望l[0]将变为1的逻辑。您从不为该元素赋值,也不通过整个对象赋值或递归调用的参数来重构l。您从不更改
l
,它从len(l)==1开始,这意味着它打印两次并存在:您的else
永远不会触发。如何输入[0]
是否导致您描述的输出?请将您的问题包括在内。@Keiwan任何有效的输入(列表)都可以提供给该函数,它将输出上述内容,或者输出两次所提供的列表,并加上0和1。我怀疑这不是他想要的。我怀疑你只需要将=1
更改为>1
。然后它将在第一次调用时使用else
子句,并在递归中使用Then
子句。结果我把它简化得太多了。我的意思是:def(l):对于范围(3)中的I:if len(l)>1:print(l+[I]),否则:返回f(l+[I])f([])
我想要的是这样一个函数在第一级调用f([0]),然后是f([1]),依此类推。我现在看到的问题是return
中断了for循环。我应该编辑我的问题吗?似乎我不能删除它,但以它的当前形式,这确实是一个糟糕的问题。