2012-10-15 43 views
0

我在調試此代碼片段時遇到問題。不要緊,它實際上並沒有回報作者想要的東西,我已經解釋說,我的問題是不同的。迭代器意外增加自己?

def factors(n): 
    result = [] 
    for x in xrange(2,n): 
     print "\t%i,foo" % x 
     if n % x == 0: 
      isPrime = True 
      print "\t\t%i,bar" % x 
      for factor in result: 
       print "\t\t%i %% %i = %i" % (x,factor,x % factor) 
       if x % factor == 0: 
         isPrime = False 
         print "\t\t\t%i,foobar" % x 
         subFactors = factors(x) 
         result.extend(subFactors) 
      if isPrime: 
       result.append(x) 
print "" 
return result 

def main(): 
    factor = dict() 
    for i in xrange(1,100): 
     factor[i] = factors(i) 
     factor[i].insert(0,1) 
     factor[i].append(i) 
     print "%i: %s" % (i,factor[i]) 

if __name__ == "__main__": 
    main() 

該代碼是無限循環!具體來說,重複輸出以下內容:

2,foo 
    2,bar 
3,foo 

    4 % 2 = 0 
     4,foobar 

注意,在第二次迭代它不打印「欄中的」打印語句,以及x變化從「欄中的」 print語句「國防部」的價值打印聲明。

我無法向作者解釋此行爲。你們中的一個人能夠善待人嗎?

回答

2

問題是,當您迭代其內容時,您正在擴展result列表。這裏有兩個關鍵的線條,沒有他們周圍的其他干擾位:

for factor in result: 
    result.extend(subFactors) 

這不確定的行爲,根據蟒蛇規範。我很確定這是無限循環的原因。

+0

這是否也可以解釋爲什麼「酒吧」級別的打印語句不會第二次出現? – rsegal

+0

也許。由於遞歸,「foo」位被重複,而由於擴展列表,「foo」位被重複。我懷疑修正是完全忽略非主要因素,因爲您將始終在外循環的上一個循環中添加其所有子因子。 – Blckknght