簡體   English   中英

無堆棧 Python - for 循環中的遞歸?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM