Прежде чем мы сможем что-то сделать с этим кодом, ему нужна помощь в удобочитаемости (я не в курсе, что не знаю французского, поэтому Python должен быть очень четким, чтобы у меня была хоть какая-то надежда на возможность выяснить, что происходит). Вот быстрый шаг, чтобы добавить ввод и исправить все ошибки PEP8. :)
from typing import List, Set, Tuple, TypeVar
Color = TypeVar('Color')
def detecter_piece(
plateau: List[List[Color]],
ligne: int,
colonne: int,
piece: Set[Tuple[int, int]]
) -> List[None]:
if plateau[ligne][colonne] is None:
return []
voisin = [
(ligne - 1, colonne),
(ligne, colonne - 1),
(ligne + 1, colonne),
(ligne, colonne + 1)
]
piece.add((ligne, colonne))
for x, y in voisin:
if (
plateau[x][y] == plateau[ligne][colonne]
and (x, y) not in piece
):
return detecter_piece(plateau, x, y, piece)
return []
Главное, что бросается в глаза, это то, что возвращаемое значение не имеет смысла (я набрал его как List[None]
, и это работало нормально, потому что пустой список никогда не добавляет ничего к нему) , Похоже, piece
накапливает всю информацию (я предполагаю, что это set
, поскольку вы add
вместо append
ing).
Обычно в рекурсивной функции, если возвращаемое значение действительно что-то значило, вы добавляете к нему значения из своих рекурсивных вызовов. Взгляд вокруг того, где это может происходить, показал мне, что я считаю ошибкой - вы return
после обработки первого соседа, когда, по-видимому, хотите обработать их все!
Попробуйте это. У меня нет ваших данных для проверки, но я подозреваю, что это довольно близко к тому, что вы пытаетесь сделать.
from typing import List, Set, Tuple, TypeVar
Color = TypeVar('Color')
def detecter_piece(
plateau: List[List[Color]],
x: int,
y: int,
piece: Set[Tuple[int, int]]
) -> None:
if plateau[x][y] is None or (x, y) in piece:
return
piece.add((x, y))
for dx, dy in [(-1, 0), (0, -1), (1, 0), (0, 1)]:
nx, ny = x + dx, y + dy
if not (nx in range(len(plateau)) and ny in range(len(plateau[0]))):
continue
if plateau[x][y] == plateau[nx][ny]:
detecter_piece(plateau, nx, ny, piece)