這個問題產生額外的空列表是關於本課程的練習:http://iloveponies.github.io/120-hour-epic-sax-marathon/sudoku.html遞歸Clojure中
我實現的功能solve
返回解決數獨板,但除了它周圍有很多空的列表。我所有的其他功能都正常工作,不會返回任何空列表。我無法弄清楚爲什麼會發生這種情況。
下面是相關代碼:
(defn solve [board]
(if-let [point (find-empty-point board)]
(let [valid-values (valid-values-for board point)]
(for [value valid-values]
(solve (set-value-at board point value))))
(if (valid-solution? board)
board)))
(def sudoku-board
(board [[5 3 0 0 7 0 0 0 0]
[6 0 0 1 9 5 0 0 0]
[0 9 8 0 0 0 0 6 0]
[8 0 0 0 6 0 0 0 3]
[4 0 0 8 0 3 0 0 1]
[7 0 0 0 2 0 0 0 6]
[0 6 0 0 0 0 2 8 0]
[0 0 0 4 1 9 0 0 5]
[0 0 0 0 8 0 0 7 9]]))
輸出:
(solve sudoku-board)
(((((())())
((((((() (())) (())) ((() (())) ((()))) ((()) ((()))))))
(() ((((() (())) (())) ((() (())) ((()))) ((()) ((()))))))
(((((() (())) (())) ((() (())) ((()))) ((()) ((())))))))
((()) (())))
(((((((() (())) (())) ((() (())) ((()))) ((()) ((()))))))
(() ((((() (())) (())) ((() (())) ((()))) ((()) ((()))))))
(((((() (())) (())) ((() (())) ((()))) ((()) ((())))))))
...
(((((((((((((((([[5 3 4 6 7 8 9 1 2]
[6 7 2 1 9 5 3 4 8]
[1 9 8 3 4 2 5 6 7]
[8 5 9 7 6 1 4 2 3]
[4 2 6 8 5 3 7 9 1]
[7 1 3 9 2 4 8 5 6]
[9 6 1 5 3 7 2 8 4]
[2 8 7 4 1 9 6 3 5]
[3 4 5 2 8 6 1 7 9]]))))))))))
...
((((((((()) ((((((()) (()))))) (((((((()))) ((())))))))) ((((((()()) (())))) ((((()()) (()))))) (())))
(((((((()())))) ((((()()))))) (()) (((((()())))) ((((()()))))))
((((()))()) ((() (())) (()) (())))
(((() (((())))) (()) (())) (((((()))))())))
(((()) ((((((()) (()))))) (((((((()))) ((())))))))) (((((((((((((())))))))))))())))))
()))))))
())))))
())))))
'for'已經是一個發電機。如果使用懶惰序列存在簡單的解決方案,那麼使用'doseq'和一個回調代替將會非常糟糕。 – amalloy
@amalloy這就是我懷疑的原因。謝謝 – coredump
@tuulik你可能應該接受其他答案 – coredump