2015-11-11 34 views
0

以下是八皇后問題的解決方案。我添加了一行來執行調試,但它改變了輸出。有人能告訴我這是什麼原因嗎? 請嘗試評論和取消註釋「#print(list(solutions))」,你就會明白我的意思了。謝謝,爲什麼添加「print(list(solutions))」更改腳本的輸出?

BOARD_SIZE = 8 

    def under_attack(col, queens): 
     return col in queens or \ 
       any(abs(col - x) == len(queens)-i for i,x in enumerate(queens)) 

    def solve(n): 
     solutions = [[]] 
     for row in range(n): 
      solutions = (solution+[i+1] 
          for solution in solutions # first for clause is evaluated immediately, 
                # so "solutions" is correctly captured 
          for i in range(BOARD_SIZE) 
          if not under_attack(i+1, solution)) 
      #print(list(solutions)) 

     return list(solutions) 

    answers = solve(BOARD_SIZE) 
    print(answers) 
+0

在某些語言中 - 比如Clojure - 你的懶惰序列實際上是從一開始就緩存它們的結果,所以你可以多次閱讀它們。 Python不是這些語言之一。 –

+0

如果以下答案之一解決了您的問題,您應該接受它(單擊相應答案旁邊的複選標記)。這有兩件事。它讓每個人都知道你的問題已經得到解決,讓你滿意,並且它可以幫助你幫助你。 [見這裏](http://meta.stackexchange.com/a/5235)的完整說明。 –

回答

2

因爲solutions是發電機,所以當你打電話print(list(solutions))你用盡發電機。您必須將list(solutions)分配給一個變量,然後打印/返回該變量。或者將發生器改爲列表理解。所以,例如。

def solve(n): 
     solutions = [[]] 
     for row in range(n): 
      solutions = [solution+[i+1] for solution in solutions for i in range(BOARD_SIZE) if not under_attack(i+1, solution)] 
      print(solutions) 

     return solutions 

我也不明白solutions = [[]],因爲你馬上覆蓋它。

相關問題