[英]Stackless Python - Recursion in a for loop?
我對編程很陌生,我已經使用 Python 幾個月了。 我試圖讓一個概念與 Stackless 一起工作,但就是不知道如何(盡管我已經編寫了其他與 Stackless 一起工作的測試腳本)。
Anywho,作為一個簡單的例子,考慮以下代碼,它遍歷一個列表並通過遞歸調用相同的 function 來找到它的所有排列(編輯:n 維笛卡爾積)。
def traverseList(theList,temp,solutions,level=1):
if level != len(theList):
for x in theList:
temp.append(x)
traverseList(theList,temp,solutions,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', 'a', 'a']... [8, 8, 8, 8, 8]
到目前為止,我發現的 Stackless 和遞歸的唯一示例似乎是 function 在完成后在 function 的末尾發送信息。 永遠不要在 for 循環的中間,就像上面所說的那樣。
我該怎么做? 我如何將它變成一個可以使用 tasklet 而不是遞歸函數運行的腳本? (這個版本是我能想到的最好的版本,但無論我怎么安排都失敗了。這是許多嘗試中的一個,我不妨在這一點上把意大利面扔到牆上。)
獎金 e-cookie 用於在沒有反彈的情況下做到這一點 function - 我還沒有找到一種方法讓單個 tasklet 將信息多次傳遞給自己而沒有一個。
謝謝你的時間!
我想你想研究“發電機”(即“產量” python 關鍵字)。 基本上,生成器可以讓您在 function 調用中間暫停並返回結果。 當 function 再次“調用”時,它會在“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,2,3,4,5):
print e
output 如下。 請注意,在生成器案例 (myGen) 中,“in myGen”與列表的打印交替打印。 但是在 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]))
或者,您可以在 tasklet 的參數列表中使用 *args / **kwargs
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.