什么构成堆栈级别太深的错误?代码卡塔

时间:2014-05-20 14:05:47

标签: ruby

我有这个代码,我正在尝试合并,但我不断得到一个堆栈级别太深的错误:

def zeros(n)
  trailing_zeros(n) if n == 1
  zeros(n-1) * n
end

def trailing_zeros(number)
 sort_sum = number.to_s.split(//).reverse
 counter = 0
 until sort_sum[counter] != "0"
  counter += 1
 end
 counter
end

puts zeros(5)

单独地,它们工作正常,但当我尝试将它们组合在一起时,我遇到了问题,我不明白为什么。为什么这构成堆栈级别太深。来自有经验的开发人员什么会提示你,这将是这种类型的错误? 我知道无限递归或者具有非常大数字的东西可能会导致它但是极限是什么?另外,我从维基百科上读到,这些类型的错误也与您运行的系统以及它可以使用或分配给方法的内存量有关。这是真的吗?

------- EDIT ---------

嗯,如果我的问题得到落实并不重要,因为我真的不明白我做错了什么。我还想提一下,我确实尝试过使用return trailing_zeros(n),就像你们提到的那样。

def zeros(n)
  return trailing_zeros(n) if n == 1
  zeros(n-1) * n
end

唯一的问题是我的值为0.我通过插入binding.pry看到了它。我知道这是一个菜鸟问题,但我不知道这里有什么问题。谢谢你的耐心。

------- ------ EDIT

为了澄清,我试图得到一个阶乘的尾随零。如果我通过5,我会得到1#120。如果我通过12,我会得到2#479001600

1 个答案:

答案 0 :(得分:1)

您的zeros功能试图做太多。它无法计算因子,同时计算其中的尾随零。

如果您考虑一下,在计算阶乘时,尾随零的数量可能(并且将会)发生变化。您只对最终价值感兴趣。所以先计算一下,然后再计算零。

# inefficient(!) recursive calculation of factorial
# for more efficiency use loop
def factorial(n)
  raise "only positive values are allowed" if n < 0

  return 1 if n == 0
  n * factorial(n - 1)
end

def zeros(n)
  trailing_zeros(factorial(n))
end

def trailing_zeros(number)
 sort_sum = number.to_s.split(//).reverse
 counter = 0
 until sort_sum[counter] != "0"
  counter += 1
 end
 counter
end

zeros(5) # => 1
zeros(12) # => 2