我是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
时无效。
答案 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
请注意,您实际上不需要额外的变量n
,num
完全有效。
答案 1 :(得分:1)
递归函数具有一定的风险,因为即使正常运行,它们也会导致“堆栈流太深”错误。它们也往往很慢,几乎总是可以循环表达该概念。
这是阶乘的红宝石式实现:
class Integer
def !
[self,1].max.downto(1).inject(&:*)
end
end
在这里起作用:
5。! => 120
这不是完美的,因为很遗憾,不可能定义一个真正的后缀运算符(ruby没有任何后缀)来仅执行5!
。实际上,我可能会使用Integer.factorial
或Integer.bang
作为名称。 “爆炸方法”通常也表示会修改接收器的某些危险操作,尽管至少危险总是与阶乘函数一起潜伏:100000000.!
会轻易导致系统崩溃。