我的return语句不会退出递归方法

时间:2017-03-08 00:02:31

标签: ruby recursion return infinite-loop roman-numerals

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

我知道代码会进入我的基本案例的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

1 个答案:

答案 0 :(得分:4)

您需要从<{1}}循环中返回,否则您的递归函数永远不会结束(至少不是巨大的迭代次数)。问题是你(貌似)想要返回ROMAN_HASH.each哈希中找到的最大值,而是迭代所有值,递归调用每个值ROMAN_HASH大于roman,对结果不执行任何操作,然后返回k迭代器。

你也在滥用if / else。你不能将post-if与else表达式混合使用。

最后,您通过返回.each来剥离最后一位数字。您需要在if num <= 1时返回output,如果输出相等num < 1,则应返回1,或者只需{{1}分支处理这种情况:

output + 'I'