2013-02-03 70 views
0

我正在寫一個簡單的應用程序,它包含一個代表英語的樹。我在C++中做了類似的事情,但這是我第一次在Python中構建樹。樹建築邏輯故障

englishWords = [] 
englishFile = open("english.txt") 
for line in englishFile: 
    englishWords.append(line.rstrip()) 

class Node: 
    def __init__(self, value): 
     self.Value = value 
     self.checked = False 
     self.Pointers = [] 
     self.numPointers = 0 
    def addNode(self, value): 
     x = Node(value) 
     self.Pointers.append(x) 
     return x 

headString = "HEAD" 
Head = Node(headString) 

def buildPointers(parent, info, nodeList): 

    x = 0 
    y = len(nodeList) 
    while x < y : 
     if parent.numPointers == 0: 
      newNode = parent.addNode(info) 
      parent.numPointers = parent.numPointers + 1 
      buildPointers(newNode, nodeList[x+1], nodeList) 
      break 
     else: 
      for i in parent.Pointers: 
       if info == i.Value: 
        buildPointers(i, nodeList[x+1], nodeList) 
        continue 
       else: 
        newNode = parent.addNode(info) 
        parent.numPointers = parent.numPointers + 1 
        buildPointers(newNode, nodeList[x+1], nodeList) 
        continue 


def treeBuild(lyst): 
    for i in lyst: 
     iList = list(i) 
     buildPointers(Head, iList[0], iList) 

treeBuild(englishWords) 

當我運行代碼的Windows寫着「python.exe已經停止運行」這可能是一些簡單,我忽略了,可以隨意撕開了我還是我寫這個的方式。我會喜歡任何批評,這將有助於使我成爲更好的程序員。

+0

您應該在某個終端窗口或IDE中運行此代碼,以便您可以查看回溯。 –

+0

運行它,由於過量的遞歸,我得到一個'RuntimeError'。 –

回答

1

基本上這不是pythonic,這裏有很多錯誤,但我猜主要問題是使用了太多的遞歸,python「開箱即用」並不是很擅長。

它將默認遞歸深度限制爲1000步。你可能需要更多。這裏有一個問題,並且answer解釋瞭如何更改這個默認值。

也是另一個很好的意見,將改變遞歸在這個blog post

P.S使用發電機一樣:既然你不改變的X while循環可能會在某些情況下,一直運行下去豈不值嗎? (我沒有完全理解的算法,所以我不知道)

編輯:,使更多的這一點Python的我會改變填充部分與上下文管理器的使用方法:

with open("english.txt") as english_file: 
    for line in english_file .. 

順便提一個更好的方法,不要將百萬字符串加載到列表中,將會將填充部分更改爲生成器函數,每次都會生成一個英文單詞 - 效率更高,而且更具pythonic。你可以閱讀有關上下文管理器和發電機功能here

另一個編輯:learining慣用蟒蛇啓動將打開一個python外殼的最佳地點和:

import this 

的「蟒蛇的禪」將出現。 現代python開發包括libs,最佳實踐,閱讀建議和寫作idomatic python的一本好的評論指南將由kenneth reitz的Hitchhikers guide to python

和類似的來源,更集中的一個,是writing idiomatic Python

好運!

+0

謝謝,這是我第一次冒險進入無指針算法邏輯。我沒有把它放在我的例子中,但我的遞歸深度設置爲60000。我真正的問題很簡單。我忽視了我沒有改變x的事實。謝謝你的幫助。 –

+0

不用客氣。我會用一些pythonic最佳實踐來編輯我的答案 – alonisser

+0

謝謝你這真的有幫助。如果還有其他任何你知道的文檔對我來說都是好的,那麼我可以利用Python的好處,而不是強迫它進入C++的超級怪胎翻譯,那太棒了! –

0

當遞歸造成無限遞歸時,實際上並沒有減少nodeList。處理完一個單詞後,您也不會正確地跳出循環。以下buildnodelist至少完成。我並不能保證它能正常工作所需的雖然因爲我只是修改了一些阻止線:

def buildPointers(parent, info, nodeList): 
    if parent.numPointers == 0: 
     newNode = parent.addNode(info) 
     parent.numPointers = parent.numPointers + 1 
     if len(nodeList) > 1: 
      buildPointers(newNode, nodeList[x+1], nodeList[1:]) 
    else: 
     for i in parent.Pointers: 
      if info == i.Value: 
       if len(nodeList) > 1: 
        buildPointers(i, nodeList[x+1], nodeList[1:]) 
      else: 
       newNode = parent.addNode(info) 
       parent.numPointers = parent.numPointers + 1 
       if len(nodeList) > 1: 
        buildPointers(newNode, nodeList[x+1], nodeList[1:]) 

從本質上講,我已經去除了While循環,並通過節點列表的第1個要素的切片,如果有超過1項目在裏面。