计算改变运动

时间:2014-05-21 18:26:56

标签: ruby sicp

我正在研究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

1 个答案:

答案 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)