2016-01-25 80 views
-4

我做了一個程序,它使用回溯算法(網格被分成兩部分,也被分成2個部分,4個單元格)解決4x4數獨,它有3個函數,首先打印網格,然後檢查數字是否可以放入單元格中,主函數(前2個函數按照它們的意圖工作)。該程序工作不正常,我在pythontutor上檢查了它並發現它返回列表,即使它不應該,例如一個數字被放入列表中,然後一個函數自己調用,如果某些數字不能被放置,那麼該函數會返回,但它似乎也返回列表。這裏是代碼。我知道這個程序有缺陷,效率不高(我也知道要改變什麼),但是由於相同的原因它不會工作。Python:函數返回一個列表,儘管它不應該

def sudoku(array): 
for x in range(2): #loop that iterates through 2 lists 
    for y in range(2): #loop that iterates through 2 lists inside lists from above 
     for z in range(4): #loop that iterates through each cell 

      if array[x][y][z] == 0: #if a cell is empty then we can write numbers in it 
       for t in range(1, 5): #loop used for writing numbers into the cells 
        array[x][y][z] = t #line that writes numbers into the cells 
        rec = check(x, y, z, t, array) #check if a number can be placed 
        if rec == False: #if it can then 
         g = sudoku(array) #call the function 
         if g == True: #if g returns true then a solution is found, stop the program 
          return True 
         elif g == False and t == 4: #if g returns false and no number can be written into the next cell, and all numbers were written into the current cell, then return 
          return False 
        elif rec == True and t == 4: #if a number cant be placed into the cell and none of the numbers are valid, then return 
         return False 
print_grid(array) #when all loops finish then a solution is found, print the grid 
return True  #return 
array = [[[0, 4, 0, 0], [0, 1, 3, 0]], [[0, 2, 4, 0], [0, 0, 1, 0]]] 
+5

你是什麼意思「返回列表」?我沒有看到函數重新調整列表。我也看不到被調用的函數。告訴我們你是怎麼稱呼它的,以及你如何得出它返回列表的結論。 –

+0

這就是問題所在,沒有一行返回一個列表(不應該返回)。函數調用自己的行g = sudoku(array)。在第一個圖像中,您可以看到3個堆棧和數字4是在列表中,但在第二個圖像中,第三堆棧已經消失,因爲沒有數字可以寫入單元格,但正如你所看到的,數字4仍然在列表中(它不應該在那裏)。 http://i.imgur.com/qH9C9fz.png http://i.imgur.com/HnyOzWY.png – Lunix

+1

它只意味着你忘記刪除該號碼。你一直在使用一個數組 - 如果你沒有移除某個數組,那麼它將保持在數組中。 – furas

回答

0

請注意,在您發佈的圖片中,所有3個幀指向相同的列表。

Same List

在Python中,列表是 '可變'。這意味着,您可以修改列表,並且引用該列表的所有變量都將指向已更改的列表。

如果你想保留原來的列表,以便您可以輕鬆地原路返回,那麼你將需要執行的整個列表的「深拷貝」:

def deep_copy(array): 
    array_copy = [[[0, 0, 0, 0], [0, 0, 0, 0]], [[0, 0, 0, 0], [0, 0, 0, 0]]] 
    for x in range(2): 
     for y in range(2): 
      for z in range(4): 
       array_copy[x][y][z] = array[x][y][z] 
    return array_copy 

我們給其他功能(或在此情況下,我們自己的功能)的列表,而不是原來的副本,這樣任何變化隻影響副本:

array_copy = deep_copy(array) 
g = sudoku(array_copy) 

Deep Copy

+0

我沒有真正測試過這個,因爲我沒有「檢查」功能。 – anjsimmo

相關問題