【发布时间】:2017-03-23 17:31:22
【问题描述】:
我有这个红宝石代码:
def get_sum n
return 0 if n<1
(n%3==0 || n%5==0) ? n+get_sum(n-1) : get_sum(n-1) #continue execution
end
puts get_sum 999
似乎在 999 之前的值有效。当我尝试9999 时,它给了我这个:
stack level too deep (SystemStackError)
所以,我添加了这个:
RubyVM::InstructionSequence.compile_option = {
:tailcall_optimization => true,
:trace_instruction => false
}
但什么也没发生。
我的红宝石版本是:
ruby 1.9.3p392 (2013-02-22 revision 39386) [x86_64-darwin12.2.1]
我还增加了机器的堆栈大小ulimit -s 32768,我认为是32MB?
我认为这不是我的代码的错,因为它适用于较小的数字,我不认为 9999 是一个大数字。我有 8GB 的 RAM,我认为它已经足够了。有什么想法/帮助吗?
【问题讨论】:
-
我认为由于
n + get_sum(n - 1),您的代码不符合尾调用优化的条件。用循环重写它。 -
我要使用递归
-
好吧,然后使用更小的
n:) -
就是这样,9999应该不会有问题。我的意思是,如果我使用 99999999 我会理解。我认为这里可能有问题
-
堆栈通常被限制在数百千字节左右,因此您拥有 8GB RAM 的事实是无关紧要的。
标签: ruby