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

如何让Ruby中的递归正确运行?Mastermind游戏递归异常问题

Mastermind游戏make_guess方法循环次数超4次的问题解决

问题说明

我在Ruby中编写Mastermind游戏(The Odin Project的练习项目),实现了#make_guess方法,计划循环4次获取用户输入并验证是否在#BALLS数组中。逻辑为:若输入属于#BALLS数组,则将其添加到#guess数组;否则递归调用该方法。但当前问题是,当输入不合法时,#make_guess方法的循环次数会超过4次。

原代码

class MasterMind
  BALLS = ['r', 'g', 'o', 'y', 'v', 'm']

  comp_selection = BALLS.sample(4)

  def make_guess
    guess = []
    until guess.length == 4
      puts "Guess the computer's combination from: 'r', 'g', 'o', 'y', 'v', 'm'"
      value = gets.chomp
      if BALLS.include?(value)
        guess.append(value)
      else
        puts 'Selection not in the combination, try again'
        make_guess
      end
    end
    guess
  end

end

master = MasterMind.new
puts master.make_guess

问题原因

问题出在**递归调用make_guess**的逻辑上:每次输入不合法时,你会触发一个新的make_guess方法实例,这个新实例会创建独立的guess数组并开始循环。而原来的make_guess方法中的until循环并未终止,等递归调用返回一个长度为4的数组后,原循环会继续往自己的guess数组中添加元素,最终导致总长度远超4。

解决方案

去掉递归逻辑,在当前循环内直接重新获取输入即可,无需重新调用整个方法。修改后的代码如下:

class MasterMind
  BALLS = ['r', 'g', 'o', 'y', 'v', 'm']

  def initialize
    # 将电脑选色移到initialize中,确保每个实例有独立的随机组合
    @comp_selection = BALLS.sample(4)
  end

  def make_guess
    guess = []
    until guess.length == 4
      puts "Guess the computer's combination from: 'r', 'g', 'o', 'y', 'v', 'm'"
      value = gets.chomp
      if BALLS.include?(value)
        guess.append(value)
      else
        puts 'Selection not in the combination, try again'
        # 不递归,直接进入下一次循环重新获取输入
      end
    end
    guess
  end

end

master = MasterMind.new
puts master.make_guess

额外说明:原代码中comp_selection = BALLS.sample(4)放在类定义中,会在类加载时就执行一次,所有实例共用同一个组合。将其移到initialize方法中,可确保每个MasterMind实例拥有独立的电脑随机组合。

内容的提问来源于stack exchange,提问作者Shahid Haris

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 19:22:13