python递归调用会互相干扰吗?

时间:2019-09-08 22:28:00

标签: python recursion

我正在尝试建立一个递归游戏求解器(适用于饼干桶式钉游戏)。递归功能似乎无法正常运行,并且某些输出的创建没有跟踪其创建方式(尽管记录了所有步骤)。 python递归步骤是否有可能彼此覆盖?

我已经尝试过在所有步骤中添加打印语句。游戏规则和算法正常运行,但是递归游戏算法未按预期运行

def recursive_play(board, moves_list, move_history, id, first_trial, recurse_counter):
    # Check how many moves are left
    tacks_left = len(char_locations(board, character=tack, grid=True))
    log_and_print(f"tacks_left: {tacks_left}")
    log_and_print(f"moves_left: {len(moves_list)}")
    log_and_print(f"moves_list: {moves_list}")

    if (len(moves_list) == 0):
        if (tacks_left == 1):
            # TODO: Remove final move separator
            log_and_print(f"ONE TACK LEFT :)!!!!")
            log_and_print(f"move_history to retrun for win: {move_history}")
            return move_history
        pass
    elif (len(moves_list) > 0):
        # Scan through all moves and make them recursively
        for move in moves_list:
            if first_trial:
                id += 1
            else:
                # id += 1
                id = id
            next_board = make_move(board, move)
            next_moves = possible_moves(next_board)
            if first_trial:
                next_history = "START: " + move
            else:
                next_history = move_history + round_separator + move

            # log_and_print(f"og_board:")
            prettify_board(board)
            log_and_print(f"move: {move}")
            log_and_print(f"next_board:")
            prettify_board(next_board)
            # log_and_print(f"next_moves: {next_moves}")
            log_and_print(f"next_history: {next_history}")
            log_and_print(f"id: {id}")
            log_and_print(f"recurse_counter: {recurse_counter}")
            # NOTE: Would this be cleaner with queues?
            recursive_play(next_board, moves_list=next_moves, move_history=next_history, id=id, first_trial=False, recurse_counter=recurse_counter+1)

        log_and_print(f"finished scanning all moves for board: {board}")

我希望所有步骤都被记录下来,并且“ START”应该仅在第一次试用时出现。但是,在以后的步骤中会出现一个神秘的“ START”,而没有关于该板的创建方式的记录。

好的输出:

INFO:root:next_history: START: 4 to 2 to 1 , 6 to 5 to 4 , 1 to 3 to 6 , 7 to 4 to 2
INFO:root:id: 1
INFO:root:recurse_counter: 3
INFO:root:tacks_left: 5
INFO:root:moves_left: 2
INFO:root:moves_list: ['9 to 8 to 7', '10 to 6 to 3']
INFO:root:o---
INFO:root:xo--
INFO:root:oox-
INFO:root:xoox
INFO:root:move: 9 to 8 to 7
INFO:root:next_board:
INFO:root:o---
INFO:root:xo--
INFO:root:oox-
INFO:root:xoox
INFO:root:next_history: START: 4 to 2 to 1 , 6 to 5 to 4 , 1 to 3 to 6 , 7 to 4 to 2 , 9 to 8 to 7
INFO:root:id: 1
INFO:root:recurse_counter: 4
INFO:root:tacks_left: 4
INFO:root:moves_left: 1
INFO:root:moves_list: ['10 to 6 to 3']
INFO:root:o---
INFO:root:xx--
INFO:root:ooo-
INFO:root:xooo
INFO:root:move: 10 to 6 to 3
INFO:root:next_board:
INFO:root:o---
INFO:root:xx--
INFO:root:ooo-
INFO:root:xooo
INFO:root:next_history: START: 4 to 2 to 1 , 6 to 5 to 4 , 1 to 3 to 6 , 7 to 4 to 2 , 9 to 8 to 7 , 10 to 6 to 3

输出不良:

INFO:root:move: 6 to 3 to 1
INFO:root:next_board:
INFO:root:x---
INFO:root:xo--
INFO:root:ooo-
INFO:root:oooo
INFO:root:next_history: START: 6 to 3 to 1
INFO:root:id: 2
INFO:root:recurse_counter: 0
INFO:root:tacks_left: 2
INFO:root:moves_left: 1
INFO:root:moves_list: ['1 to 2 to 4']
INFO:root:o---
INFO:root:oo--
INFO:root:xoo-
INFO:root:oooo
INFO:root:move: 1 to 2 to 4
INFO:root:next_board:
INFO:root:o---
INFO:root:oo--
INFO:root:xoo-
INFO:root:oooo
INFO:root:next_history: START: 6 to 3 to 1 , 1 to 2 to 4
INFO:root:id: 2
INFO:root:recurse_counter: 1
INFO:root:tacks_left: 1
INFO:root:moves_left: 0
INFO:root:moves_list: []
INFO:root:ONE TACK LEFT :)!!!!
INFO:root:move_history to retrun for win: START: 6 to 3 to 1 , 1 to 2 to 4
INFO:root:finished scanning all moves for board: ['o---', 'oo--', 'xoo-', 'oooo']

任何人都能提供的提示将不胜感激。

0 个答案:

没有答案