Функция возвращает тип None, когда я ожидаю массив - PullRequest
0 голосов
/ 14 марта 2020

Я пытаюсь вернуть массив, который был передан через рекурсивную функцию. Но я только возвращаю None, вместо ожидаемого массива bo Numpy.

import numpy as np

board = [0, 0, 4, 5, 1, 9, 0, 0, 0, 6, 1, 0, 0, 7, 0, 0, 5, 9, 0, 0, 0, 6, 3, 0, 0, 0, 0, 5,
         4, 0, 3, 0, 0, 0, 0, 2, 3, 0, 6, 0, 0, 0, 0, 0, 0, 1, 0, 0, 4, 0, 0, 0, 6, 7, 0, 0, 2, 0,
         0, 0, 4, 0, 5, 8, 0, 0, 0, 4, 0, 0, 2, 0, 4, 0, 0, 1, 0, 0, 7, 0, 6]

grid = np.asarray(board).reshape(9, 9)


def possible(bo, y, x, n):
    for i in range(0, 9):
        if bo[y][i] == n:
            return False
    for i in range(0, 9):
        if bo[i][x] == n:
            return False
    x0 = (x // 3) * 3
    y0 = (y // 3) * 3
    for i in range(0, 3):
        for j in range(0, 3):
            if bo[y0 + i][x0 + j] == n:
                return False
    return True


def solve(bo):
    for y in range(9):  # row
        for x in range(9):  # column
            if bo[y][x] == 0:
                for n in range(1, 10):
                    if possible(bo, y, x, n):
                        bo[y][x] = n
                        solve(bo)
                        bo[y][x] = 0
                return
    return bo

solved = solve(grid)
print(solved)

Почему это так?

Я могу распечатать его на консоли , Но возвращаемое значение равно None.

Следует отметить, что первый оператор return выходит из рекурсивной функции. Позволяет перейти к последующим элементам в массиве.

(предыдущий вопрос был помечен как дубликат, но связанный вопрос не ответил на мой запрос)

Редактировать: чтобы было понятно, что я ' Я пытаюсь сделать. Я пытаюсь вернуть измененный массив bo. Первый оператор return выходит из рекурсивного оператора for n in range. И затем пробегает с другим # в диапазоне.

Ответы [ 2 ]

0 голосов
/ 14 марта 2020

Если я изменю голую return строку на:

 return 'foobar' 

, то результат будет:

In [5]: grid = np.asarray(board).reshape(9, 9)                                                                       
In [6]: solve(grid) 
Out[6]: 'foobar'

Голый return такой же, как return None (как падает с конца функции).

Даже если функция является рекурсивной и изменяет bogrid после запуска она имеет правильные значения), функция возвращает это условие, а не последняя строка return bo.

Итак,

return bo

в обоих местах возвращает измененный grid.

def solve(bo):  
    for y in range(9):  # row  
        for x in range(9):  # column  
            if bo[y][x] == 0:  
                for n in range(1, 10):  
                    if possible(bo, y, x, n):  
                        bo[y][x] = n  
                        solve(bo)           # doesn't use the return value  
                        bo[y][x] = 0  
                return bo       # final return 
    return # bo optional

В пределах рекурсии, на которую вы рассчитываете bo будучи измененным, и никогда не использовать возвращаемое значение. Вот почему с solve(grid), grid изменяется. Если вы хотите, чтобы solve возвратил модифицированный grid, вы должны вернуть его явно.

В коде, подобном этому, вы должны внимательно следить за всеми операторами return и знать, что возвращаясь, когда.

0 голосов
/ 14 марта 2020

Я считаю, что ваша проблема в вашем return утверждении в вашей solve(bo) функции.

for n in range(1, 10):
    if possible(bo, y, x, n):
        bo[y][x] = n
        solve(bo)
        bo[y][x] = 0
return

Всякий раз, когда ваша функция завершает это l oop, она всегда будет возвращать None, потому что она имеет возврат, но ничего не возвращает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...