如何让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
相关产品推荐
相关产品推荐

