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循环。我应该编辑我的问题吗?似乎我不能删除它,但以它的当前形式,这确实是一个糟糕的问题。