2017-06-25 55 views
0

我在药剂创建一个阶乘函数:理解递归与灵药

所有的
def factorial(0), do: 1 
def factorial(n) when n > 0, do: n * factorial(n - 1) 

首先,我爱多么简单而优雅的解决方案是药剂。但是,有一件事我不明白。在第二行,我使用了这个代码:do: n * factorial(n - 1)。假设我们给该函数一个参数5.该行看起来像这样。 do: 5 * factorial(5 - 1)那么为什么不回答这个问题:20?基本上我的问题是。它如何知道继续基本情况?我们没有明确地告诉程序继续到0,是吗?如果有人可以打破这一点,那将是非常棒的!

回答

3

是的,你明确地告诉它继续直到0.这是第一个子句的作用def factorial(0), do: 1。当你减少到0时,这个原因最终会被调用。它是跳出递归的子句(返回1,并且不再调用阶乘)。

另请注意when n > 0后卫只是在那里你可以调用负数的阶乘。例如,在factorial(5)的情况下不使用它。