我正在研究SICP书中的计数变化算法。我试图在Ruby中正确使用它。首先,我现在遇到语法失败的问题,它已变成无限循环
irb(main):001:0> count_change(5)
SystemStackError:堆栈级别太深 from ... /。rbenv / versions / 2.1.1 / lib / ruby / 2.1.0 / irb / workspace.rb:86 也许是IRB的错误!
我认为现在是使用StackOverflow的好时机。如果你能提供帮助,它会有很多帮助。我认为问题在第12行。 感谢。
def count_change amount
cc(amount, 5)
end
def cc(amount, kinds_of_coins)
if amount == 0
1
elsif amount < 0 || kinds_of_coins == 0
0
else
cc amount, (kinds_of_coins - 1) +
cc((amount - (first_denomination(kinds_of_coins))), kinds_of_coins)
end
end
def first_denomination(kinds_of_coins)
if kinds_of_coins == 1
1
elsif kinds_of_coins == 2
5
elsif kinds_of_coins == 3
10
elsif kinds_of_coins == 4
25
elsif kinds_of_coins == 5
50
end
end
答案 0 :(得分:1)
你的问题在这一行:
cc amount, (kinds_of_coins - 1) +
cc((amount - (first_denomination(kinds_of_coins))), kinds_of_coins)
实际上是
cc(amount,
(kinds_of_coins - 1) + cc((amount - (first_denomination(kinds_of_coins))), kinds_of_coins))
当amount
为5且kinds_of_coins
为2 (amount - (first_denomination(kinds_of_coins)))
时返回0
,这意味着cc(0, anything)
会返回1
- 并且下一次递归再次cc(5, 2)
......
我不熟悉SICP算法,但我怀疑你意味着写的是
cc(amount, (kinds_of_coins - 1)) +
cc((amount - (first_denomination(kinds_of_coins))), kinds_of_coins)