You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python实现Nim游戏的Minimax算法?递归实现结果异常求助

用Python实现Nim游戏的Minimax算法(附问题排查)

嘿,刚接触递归和Minimax确实容易绕得头晕,我来帮你理清楚Nim游戏里的Minimax逻辑,顺便找找你返回值不对的问题~

首先得明确Nim游戏的核心规则(咱们假设是经典的1-3取石子玩法:每次可以拿1、2、3颗,取最后一颗的人赢),以及Minimax算法的本质:这是个零和游戏,两个玩家分别是「最大化玩家」(想让自己的得分最高,赢的话得100分)和「最小化玩家」(想让对手的得分最低,也就是让自己的损失最小,输的话得-100分)。递归的过程就是模拟双方轮流选择最优走法的过程。

正确的Minimax实现代码

def minimax(n, is_maximizing):
    # 终止条件:当前玩家能直接取完所有石子,赢了
    if n <= 3:
        return 100 if is_maximizing else -100
    
    if is_maximizing:
        best_score = -float('inf')
        # 遍历所有合法取法
        for take in [1, 2, 3]:
            # 递归调用,轮到对手(最小化玩家)行动
            score = minimax(n - take, False)
            # 最大化玩家选得分最高的走法
            best_score = max(best_score, score)
        return best_score
    else:
        best_score = float('inf')
        for take in [1, 2, 3]:
            score = minimax(n - take, True)
            # 最小化玩家选得分最低的走法(对对手最不利)
            best_score = min(best_score, score)
        return best_score

# 测试案例
print(minimax(5, True))  # 输出100(先手能赢)
print(minimax(4, True))  # 输出-100(先手必败)

你返回值异常的常见原因

结合你说的递归逻辑问题,大概率是这几个点搞反了:

  • 最大化/最小化分支的选择逻辑搞反:比如在最大化玩家的代码块里用了min()而不是max(),导致本该选最优的赢法,结果选了最差的输法。
  • 终止条件的返回值搞反:比如当玩家能直接赢的时候,给最大化玩家返回了-100,给最小化玩家返回了100,完全颠倒了胜负得分。
  • 递归传递的玩家状态错了:比如调用递归时把is_maximizing的布尔值传反了,导致玩家身份混乱,得分逻辑自然出错。

调试递归的小技巧

刚学递归最头疼的就是看不到内部流程,你可以在函数开头加一行打印,跟踪每一步的递归状态:

def minimax(n, is_maximizing):
    print(f"当前石子数:{n},当前玩家是最大化玩家?{is_maximizing}")
    # 后面的代码不变...

这样就能清晰看到每一步的玩家身份和剩余石子数,很容易定位到哪一步的逻辑偏离了预期。

内容的提问来源于stack exchange,提问作者Vural Erdogan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:36:18