使用递归求解的简单罗马数字算法。
我知道代码符合我的基本案例的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
哈希中最大的值,但相反,您迭代所有值,递归地调用大于 k
的 roman
结果,然后返回.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