2015-06-20 51 views
3

我已經編寫了一個算法,可以掃描「ID's」文件並將該值與整數i的值進行比較(我已將整數轉換爲字符串爲了比較,我已經修剪了行中的「\ n」前綴)。該算法會比較文件中每行的這些值(每個ID)。如果它們相等,算法會將i增加1,並使用i的新值進行reccurtion。如果該值不相等,則將其與文件中的下一行進行比較。它會這樣做,直到它具有不在文件中的i值,然後返回該值以用作下一條記錄的ID。嘗試查找下一個最大值時發現Python算法錯誤

我的問題是我有一個ID的文件列表1,3,2,因爲我刪除了一個ID 2的記錄,然後創建一個新的記錄。這顯示算法正常工作,因爲它給以前刪除的2的ID的新記錄。但是,當我創建新記錄時,下一個ID是3,導致我的ID列表顯示爲:1,3,2,3而不是1,3,2,4。波紋管是我的算法,帶有print()命令的結果。我可以看到它出錯的地方,但不知道爲什麼。有任何想法嗎?

算法:

def _getAvailableID(iD): 
     i = iD 
     f = open(IDFileName,"r") 
     lines = f.readlines() 
     for line in lines: 
      print("%s,%s,%s"%("i=" + str(i), "ID=" + line[:-1], (str(i) == line[:-1]))) 
      if str(i) == line[:-1]: 
       i += 1 
       f.close() 
       _getAvailableID(i) 
     return str(i) 

輸出: (輸出當算法被用於查找用於記錄適當的ID應具有的4 ID運行):

i=1,ID=1,True 
i=2,ID=1,False 
i=2,ID=3,False 
i=2,ID=2,True 
i=3,ID=1,False 
i=3,ID=3,True 
i=4,ID=1,False 
i=4,ID=3,False 
i=4,ID=2,False 
i=4,ID=2,False 
i=2,ID=3,False 
i=2,ID=2,True 
i=3,ID=1,False 
i=3,ID=3,True 
i=4,ID=1,False 
i=4,ID=3,False 
i=4,ID=2,False 
i=4,ID=2,False 
+2

是否有你需要使用遞歸函數或者你可以使用一個列表(或清單)或字典理由嗎? – JGreenwell

回答

6

我想您的程序因您需要更改而失敗:

_getAvailableID(i) 

return _getAvailableID(i) 

(目前遞歸函數查找並拋棄了正確的答案。)

但是,它可能會更好,就乾脆把你所看到的所有ID爲一組,以使程序更高效。

例如在僞代碼:

S = set() 
loop over all items and S.add(int(line.rstrip())) 
i = 0 
while i in S: 
    i += 1 
return i 
+1

如果我把'return _getAvailableID(i)',它會返回到'_getAvailableID(i)'的第一次調用,這會挫敗遞歸的目的嗎? –

+1

我道歉,你說得對。這現在可行,非常感謝:) –

1

如果你只是尋找文件中的最大ID,然後要返回一個可用值:用含有輸入文件

def _getAvailableID(IDFileName): 
    iD = '0' 
    with open(IDFileName,"r") as f: 
     for line in f: 
      print("ID=%s, line=%s" % (iD, line)) 
      if line > iD: 
       iD = line 

    return str(int(iD)+1) 

print(_getAvailableID("IDs.txt")) 

1 
3 
2 

它輸出

ID=1, line=1 

ID=1 
, line=3 

ID=3 
, line=2 

4 

然而,我們可以在一個更Python的方式解決這個問題:

def _getAvailableID(IDFileName): 
    with open(IDFileName,"r") as f: 
     mx_id = max(f, key=int) 
    return int(mx_id)+1 
+1

是的這是正確的。最小ID將始終爲1 –

相關問題