我正在使用Ruby v1.9.1为大学的班级编写一个带Ackermann函数的程序。代码如下:
def ackermann(n,m)
if n == 0 && m > 0
return m+1
elsif n > 0 && m == 0
return ackermann(n-1,1)
elsif n > 0 && m > 00
return ackermann(n-1,ackermann(n,m-1))
else
puts "Wrong input, m and n must be higher than 0"
end
end
puts ackermann(5,5)
这是一个高度递归的功能。所以我得到错误“堆栈级别太深(SystemStackError)”。有没有办法或解决方法来修复此错误?
答案 0 :(得分:2)
您可以将其重写为非递归函数,因此它不会耗尽堆栈空间,但它完全没有意义。
查看这些值的range。
答案 1 :(得分:1)
记住递归调用。制作{[int,hyperlong] =>的地图hyperlong}使用动态编程方法来耗尽堆栈空间。
这是一个C ++示例:http://pastebin.com/tVQ7yB31
已知错误:ack(3,10)占用超过3 GB的堆内存。
答案 2 :(得分:0)
尾递归算法(恐怕算法中的第6行使得它不是尾递归的)可以使用TCO(尾调用优化)。在Ruby 1.9中启用它:
RubyVM::InstructionSequence.compile_option = {
:tailcall_optimization => true,
:trace_instruction => false,
}
根据LtU人的说法,算法可以写成尾递归: