Рекурсивный вызов прерывается циклом - PullRequest
0 голосов
/ 14 апреля 2020

Я пишу эту функцию, которая берет координаты данной точки (ligne, colonne) и проверяет каждого соседа этой точки, добавляя их к piece, если значение plateau[x.neighbour][y.neighbour] == plateau[x.given][y.given], проверяемое значение - цвет. Эта часть работает, но у меня проблема в том, что мой l oop останавливается при каждом рекурсивном вызове, который необходим для проверки соседа любого «действительного» соседа, а когда рекурсивный вызов завершен, мой l oop не продолжить.

def detecter_piece(plateau, ligne, colonne, piece):

    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)

1 Ответ

0 голосов
/ 14 апреля 2020

Прежде чем мы сможем что-то сделать с этим кодом, ему нужна помощь в удобочитаемости (я не в курсе, что не знаю французского, поэтому 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)
...