使用Ruby的因子

时间:2018-01-04 17:28:48

标签: ruby

我是Ruby的新手,我正在尝试创建一个返回数字阶乘的方法。我脑子里有逻辑,我知道它是如何工作的但是,我错过了一些东西,所以它可以在Ruby中工作。在运行我的代码时:

def factorial(num)
  n = num
  if n == 0
    1
  end
  n * factorial(num - 1)
end

我一直收到此错误:stack level too deep from: (pry):327:in `factorial'

我在之前的主题中已经读过一些关于它的内容,我知道它与我有关,不区分我的方法论证和我的变量n / num。我只是无法弄清楚如何解决它以及为什么我的解决方案在将num的值分配给新变量n时无效。

2 个答案:

答案 0 :(得分:3)

def factorial(num)
  n = num
  if n == 0
    1
  else   # ⇐ HERE
    n * factorial(num - 1)
  end
end

您遇到的问题是n * factorial(num - 1)(递归调用)仍然执行甚至非正面n

我相信,所谓的“早期回归”会使这段代码更具可读性:

def factorial(num)
  return 1 unless num > 0
  num * factorial(num - 1)
end

请注意,您实际上不需要额外的变量nnum完全有效。

答案 1 :(得分:1)

递归函数具有一定的风险,因为即使正常运行,它们也会导致“堆栈流太深”错误。它们也往往很慢,几乎总是可以循环表达该概念。

这是阶乘的红宝石式实现:

class Integer

  def !
    [self,1].max.downto(1).inject(&:*)
  end

end  

在这里起作用:

  

5。!       => 120

这不是完美的,因为很遗憾,不可能定义一个真正的后缀运算符(ruby没有任何后缀)来仅执行5!。实际上,我可能会使用Integer.factorialInteger.bang作为名称。 “爆炸方法”通常也表示会修改接收器的某些危险操作,尽管至少危险总是与阶乘函数一起潜伏:100000000.!会轻易导致系统崩溃。