使用递归实现Euclid的GCD算法时的SystemStackError

时间:2014-12-22 22:25:36

标签: ruby recursion

我试图用Ruby编写Euclid GCD算法。

def euclid(m, n)
  n == 0 ? m : euclid(n, m % n)
end

对于我尝试过的任何输入,我都会遇到相同的错误:stack level too deep (SystemStackError)

我认为我需要帮助理解脚本语言中的递归。

3 个答案:

答案 0 :(得分:2)

您的代码没问题,只需删除euclid (euclid(之间的空白

def euclid(m, n)
  n == 0 ? m : euclid(n, m % n)
end

答案 1 :(得分:1)

除了处理修复递归调用的解决方案之外,如果有帮助,euclid算法的优点在于它具有尾递归,即,您可以将其转换为迭代解决方案。

def euclid(m, n)
  while n != 0
    t = n
    n = m % n
    m = t
  end
  m
end

答案 2 :(得分:0)

该错误是由于对于euclid的输入,该函数必须调用自身太多次并且堆栈内存不足。如果堆栈上有无限的内存,您的实现将正常工作。请注意您的euclid版本如何适用于小输入。可以通过使用迭代来解决问题:

def euclid(m, n)
  m, n = n, m % n until n == 0
  m
end