使用Ruby中的Ackermann函数“堆栈级太深”

时间:2011-11-05 19:13:42

标签: ruby stack

我正在使用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)”。有没有办法或解决方法来修复此错误?

3 个答案:

答案 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人的说法,算法可以写成尾递归:

http://lambda-the-ultimate.org/node/2673