【发布时间】:2013-05-21 04:52:20
【问题描述】:
在递归中,方法调用自身。当有返回值时,我不关注它。例如,在 Chris Pine 的“学习编程”一书中,有这个关于阶乘的示例。
def factorial num
if num < 0
return 'You cant\'t take the factorial of a negative number!'
end
if num <= 1
1
else
num * factorial(num-1)
end
end
如果我调用factorial(3) 方法,它将转到代码的else 部分,如下所示:
3 * factorial(3-1)
并且应该返回6,因为3*2=6。 factorial(3-1) 调用 factorial 方法,在递归中传递 2。 num = 2,因此 2 * factorial(2-1) 和 2*1=2。
我们第一次运行代码时得到的6 会发生什么变化?现在是num = 1,看起来现在将返回1 并转到代码的末尾。但据我了解,我们仍然有来自先前递归的6 和2。我在这个假设中是否正确,因为当我们乘以 num 时我们调用了阶乘函数?有人可以帮助我更好地理解这一点吗?假设我们调用了factorial(10),这将如何解决?
【问题讨论】:
-
你看《盗梦空间》了吗?
-
所有这些代码......当你所要做的就是:
def fact(n) (1..n).inject(1) {|r,i| r*i } end:) -
阶乘函数总是被用作递归的一个例子,当它是一种可怕的解决问题的方法时。我认为这对初级程序员造成了各种脑损伤,因为每个问题都需要通过递归而不是像堆栈这样的适当技术来解决。