简单罗马数字算法使用递归解决。
我知道代码会进入我的基本案例的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
答案 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'