我的返回声明不会退出递归方法



使用递归求解的简单罗马数字算法。

我知道代码符合我的基本案例的IF语句。当我使用" pry"检查值时,一切都很好。但是,它只是跳过了我的返回声明,并陷入了无限循环

 ROMAN_HASH = {
   1000 => "M",
   900 => "CM",
   400 => "CD",
   500 => "D",
   100 => "C",
   90 => "XC",
   50 => "L",
   40 => "XL",
   10 => "X",
   9 => "IX",
   5 => "V",
   4 => "IV",
   1 => "I"
 }
   def roman(num, output="")
      return output if num <= 1
    else
      ROMAN_HASH.each do |k,v|
        roman(num - k, output+v) if num >= k
      end
    end
   end

您需要返回ROMAN_HASH.each循环中,或者您的递归功能永无止境(至少,不适合 gumain迭代)。问题在于您(看似)打算返回ROMAN_HASH哈希中最大的值,但相反,您迭代所有值,递归地调用大于 kroman结果,然后返回.each迭代器。

如果/其他,您也会滥用。您不能与其他表达式混合。

最后,您通过返回if num <= 1剥离了最后一位数字。您需要在num < 1时返回output,如果输出为等于1,则应返回output + 'I',或者让else分支处理此情况:

def roman(num, output="")
  if num < 1
    return output
  else
    ROMAN_HASH.each do |k, v|
      return roman(num - k, output+v) if num >= k
    end
  end
end

最新更新