2016-09-08 82 views
0

代碼:Python列表返回 '無'

puzzle1= [ 
      [7,0,0,0,0,0,2,1,8], 
      [0,4,8,6,2,9,0,0,0], 
      [0,0,3,0,0,1,0,0,0], 
      [0,0,7,0,0,8,0,3,2], 
      [0,0,9,7,0,6,5,0,0], 
      [6,8,0,1,0,0,7,0,0], 
      [0,0,0,2,0,0,4,0,0], 
      [0,0,0,4,1,5,8,7,0], 
      [3,5,4,0,0,0,0,0,6] 
      ] 
def eliminate_values(puzzle): 
    redo = False 
    for i in range(9): 
     for j in range(9): 
      if puzzle[i][j]==0 or isinstance(puzzle[i][j], list): 
       puzzle[i][j] = [] 
       for num in range(1,10): 
        num_check = True; 
        for x in range(9): 
         if puzzle[i][x]==num: 
          num_check = False 
         if puzzle[x][j]==num: 
          num_check = False 
         if i<3: 
          aa=0 
         elif i<6 and i>2: 
          aa=3 
         else: 
          aa=6 
         if j<3: 
          bb=0 
         elif j<6 and j>2: 
          bb=3 
         else: 
          bb=6 
         for a in range(3): 
          for b in range(3): 
           if puzzle[a+aa][b+bb]==num: 
            num_check = False 
        if num_check: 
         puzzle[i][j].append(num) 
       if len(puzzle[i][j]) == 1: 
        puzzle[i][j] = puzzle[i][j][0] 
        redo = True; 
    if redo: 
     eliminate_values(puzzle) 
    else: 
     print(puzzle) 
     return puzzle 

puzzle=eliminate_values(puzzle1) 
print(puzzle) 

控制檯:

[[7, 9, 6, 3, 5, 4, 2, 1, 8], [1, 4, 8, 6, 2, 9, 3, 5, 7], [5, 2, 3, 8, 7, 1, 9, 6, 4], [4, 1, 7, 5, 9, 8, 6, 3, 2], [2, 3, 9, 7, 4, 6, 5, 8, 1], [6, 8, 5, 1, 3, 2, 7, 4, 9], [8, 7, 1, 2, 6, 3, 4, 9, 5], [9, 6, 2, 4, 1, 5, 8, 7, 3], [3, 5, 4, 9, 8, 7, 1, 2, 6]] 
None 

評論:

我是新來的Python,但我不明白爲什麼印刷是函數內的工作,不在它被返回到主程序之後。 (希望它打印兩次,但只打印一次,然後「無」)

+1

你可能應該在'if redo'中做'return elimin_values(puzzle)'。 –

+0

'if redo: return elimin_values(puzzle)' –

回答

2

@tobias_k是對的。

在每一個遞歸函數中,你都有一個基本情況和一個遞歸情況。基本情況是當你到達你的遞歸結束時,並返回遞歸函數的最終值。遞歸的情況是函數再次調用自己的地方。

你需要在兩種情況下返回。

如果你不這樣做,那麼即使你最終擊中了你的基本情況,基本情況的返回值也不會被傳遞到堆棧。

即:

def recursiveDecrement(x): 
    if x > 0: 
     print("Recursive case. x = %s" %x) 
     recursiveDecrement(x - 1) 
     print("I should have returned...x = %s" %x) 
    else: 
     print("Base case. x = %s" %x) 
     return x 

如果我打電話recursiveDecrement(5)我的輸出是:

Recursive case. x = 5 
Recursive case. x = 4 
Recursive case. x = 3 
Recursive case. x = 2 
Recursive case. x = 1 
Base case. x = 0 
I should have returned...x = 1 
I should have returned...x = 2 
I should have returned...x = 3 
I should have returned...x = 4 
I should have returned...x = 5 

然而,一旦基本情況被擊中,該方法只是繼續執行,並在年底沒有什麼返回和x仍然等於5.

更改您的if語句返回在這兩種情況下,一切都應該工作。

if redo: 
    return eliminate_values(puzzle) 
else: 
    return puzzle 
1

如果redoTrue,你是遞歸調用你的函數,並某處堆,一旦redoFalse,打印並返回結果。但是,此結果不會傳播到調用堆棧,因此最外面的函數調用將不會返回任何內容,即None,然後將其打印出來。對於這一點,你還必須return遞歸調用的結果:

if redo: 
     return eliminate_values(puzzle) # try again and return result 
    else: 
     return puzzle # result found in this try, return it 

或者,而不是使用遞歸,你可以換你的函數體在while循環。