2013-10-13 89 views
-1
a="003020600900305001001806400008102900700000008006708200002609500800203009005010300" 
b=[] 
def same_row(i,j): return (i/9 == j/9) 
def same_col(i,j): return (i-j) % 9 == 0 
def same_block(i,j): return (i/27 == j/27 and i%9/3 == j%9/3) 
def r(a): 
    i = a.find('0') 
    if i == -1: 
     b.append(a) 
     return a 

    excluded_numbers = set() 
    for j in range(81): 
    if same_row(i,j) or same_col(i,j) or same_block(i,j): 
     excluded_numbers.add(a[j]) 

    for m in '123456789': 
    if m not in excluded_numbers: 
     return r(a[:i]+m+a[i+1:]) 


print r(a),b 

這是一個數獨求解器。它用0和1-9數字輸入一個81字符串,並返回一個沒有0的字符串。給出的例子輸入一個字符串a,它應該返回結果字符串。您可以驗證該函數返回通過將exit(a)而不是return ab.append(a)python中的遞歸和返回值

當試圖打印由遞歸函數r它沒有返回值返回的結果的結果。儘管我填寫b表格b.append(a),但它打印出一張空白表格。

+1

AFAIK Python是不是最好的語言來嘗試遞歸,它可以非常迅速地用完棧。 – Ashalynd

+3

如何輸出期望的例子? –

+0

@JonClements我認爲他正在嘗試解決Sudoku,他想打印解決的棋盤。 – thefourtheye

回答

3

您需要遞歸調用價值returnr

+0

你是什麼意思? – spiros

+1

你正在調用'r',但你沒有使用'return',所以遞歸調用的值被拋棄了。 –