Comportamento estranho em uma função durante a implementação do algoritmo de remoção de alfa-beta

Eu implementei um algoritmo minimax com poda alfa-beta. A fim de obter o melhor movimento, eu chamo o algoritmo alpha-beta com orootAlphaBeta função. No entanto, norootAlphaBeta função, eu vi algum comportamento muito estranho. Quando eu chamo orootAlphaBeta função com umply de 4, faz cerca de 20 000 chamadas, mas quando eu chamo oalphaBeta função diretamente, faz apenas cerca de 2000 chamadas. Não consigo encontrar qual é o problema, pois o número de chamadas deve ser o mesmo.

O movimento que os dois algoritmos eventualmente encontrarem deve ser o mesmo, certo? Acho que sim, pelo menos a pontuação do movimento é a mesma, não tenho como saber o movimento doalphaBeta escolhe quando eu chamo diretamente semrootAlphaBeta.

def alphaBeta(self, board, rules, alpha, beta, ply, player):
    """Implements a minimax algorithm with alpha-beta pruning."""
    if ply == 0:
        return self.positionEvaluation(board, rules, player)

    move_list = board.generateMoves(rules, player)
    for move in move_list:
        board.makeMove(move, player)
        current_eval = -self.alphaBeta(board, rules, -beta, -alpha, ply - 1,
                                       board.getOtherPlayer(player))
        board.unmakeMove(move, player)

        if current_eval >= beta:
            return beta

        if current_eval > alpha:
            alpha = current_eval

    return alpha


def rootAlphaBeta(self, board, rules, ply, player):
    """Makes a call to the alphaBeta function. Returns the optimal move for a 
    player at given ply."""
    best_move = None
    max_eval = float('-infinity')

    move_list = board.generateMoves(rules, player)
    for move in move_list:
        board.makeMove(move, player)
        current_eval = -self.alphaBeta(board, rules, float('-infinity'),
                                       float('infinity'), ply - 1,
                                       board.getOtherPlayer(player))
        board.unmakeMove(move, player)

        if current_eval > max_eval:
            max_eval = current_eval
            best_move = move

    return best_move

questionAnswers(1)

yourAnswerToTheQuestion