微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

无堆栈Python-for循环中的递归?

如何解决无堆栈Python-for循环中的递归?

| 我对编程还很陌生,并且已经使用Python几个月了。我正在尝试使概念与stackless一起使用,但无法弄清楚它是如何工作的(尽管我已经编写了与stackless一起使用的其他测试脚本)。 作为一个精简的示例,任何人都可以考虑下面的代码,该代码遍历一个列表,并通过递归调用同一函数来查找列表的所有排列(编辑:n维笛卡尔积)。
def traverseList(theList,temp,solutions,level=1):
    if level != len(theList):
        for x in theList:
            temp.append(x)
            traverseList(theList,level+1)
            temp.pop()
    else:
        for x in theList:
            temp.append(x)
            solutions.append(temp[:])
            temp.pop()

myList = [\"a\",None,2,\"gamma\",8] #the list doesn\'t always have just numbers
solutionList = []
tempList = []

traverseList(myList,tempList,solutionList)
print(\"%s... %s\" %(solutionList[0],solutionList[-1]))
产生:
[\'a\',\'a\',\'a\']... [8,8,8]
到目前为止,似乎我在stackless和递归中找到的唯一示例都具有在函数完成后将信息发送到函数末尾的功能。绝对不要在for循环的中间,如上所述。 我该怎么办?我如何将其转换为可与tasklet而非递归函数一起运行的脚本? (此版本是我能想到的最好的版本,但是无论如何安排它都会失败。这是许多尝试中的一种,我现在不妨将意大利面扔在墙上。) 额外的e-cookie无需执行bounceBack功能即可实现-我还没有找到一种方法可以让单个tasklet多次将信息传递给自身,而无需一次。 谢谢你的时间!     

解决方法

        我认为您想研究\“ generators \”(即\“ yield \” python关键字)。基本上,生成器使您可以在函数调用中间停顿一下并返回结果。当函数再次被“调用”时,它将在“ yield”之后的那一行继续执行。当您最终“返回”时,您就完成了。 这是为您提供的一些示例代码:
def myGen(*x):
  for elem in x:
    print \"in myGen\"
    yield elem

def myFn(*x):
  ret = []
  for elem in x:
    print \"in myFn\"
    ret.append(x)
  return x


for e in myGen(1,2,3,4,5):
  print e

for e in myFn(1,5):
  print e
输出如下。请注意,在生成器案例(myGen)中,“ inmyGen \”与列表的打印交替打印。但是在myFn中,当然会先打印出“ in myFn \”。
in myGen
1
in myGen
2
in myGen
3
in myGen
4
in myGen
5
in myFn
in myFn
in myFn
in myFn
in myFn
1
2
3
4
5
    ,        如果我正确理解了您的问题,并且既然您已经有了自己的方法,那么将其插入即可
import stackless as s
channel = s.channel()
s.tasklet(traverseList)(myList,tempList,solutionList)
s.run()
print(\"%s... %s\" %(solutionList[0],solutionList[-1]))
或者,您可以在任务列表的参数列表中使用* args / ** kwargs     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。