采用factorialize函数并逐步执行它

时间:2016-11-11 16:00:41

标签: javascript algorithm

请解释一下。行返回num * factorialize(num - 1)。假设我们有一个整数5作为参数。必须是5 * factorialize(5-1)= 5 * 4 = 20.我们如何到达120?

function factorialize(num) {
    if (num === 0) {
        return 1;
}

    return num * factorialize(num - 1);
}

factorialize(5)

1 个答案:

答案 0 :(得分:0)

引述您的问题

  

假设我们有一个整数5作为参数。必须是5 * factorialize(5-1)= 5 * 4 = 20.我们如何达到120?

当您从5 * factorialize(5 - 1)开始时,您评估5-1为4(正确),但随后您将该调用放入factorialize。这就是你20岁的方式。

让我们采用factorialize功能并逐步完成它。

function factorialize(num) {
    if (num === 0) {
        return 1;
    }

    return num * factorialize(num - 1);
}

factorialize(5)

由于5被传递到factorialize,因此局部变量num不等于0.此函数返回num * factorialize(num - 1)。由于num为5,我们将继续并开始插入数字。

= 5 * factorialize(5 - 1)

现在,我们再次呼叫factorialize,这次传入4(5 - 1)。这仍然不等于0,所以让我们用它的返回值替换factorialize(5 - 1)(因为num因为对factorialize的调用是4,我们将返回{{1} }

4 * factorialize(4 - 1)

和以前一样,我们现在再次调用factorialize,这次是3次传递。

= 5 * (4 * factorialize(4 - 1))

等等

= 5 * (4 * (3 * factorialize(3 - 1)))

等等

= 5 * (4 * (3 * (2 * factorialize(2 - 1))))

现在= 5 * (4 * (3 * (2 * (1 * factorialize(1 - 1))))) 返回1; if语句最终计算结果为true。这是基本情况,这是一个已知的答案,无需进一步使用递归即可表达。取而代之的是,我们得到了这个:

factorialize(0)

这在数学上等同于

= 5 * (4 * (3 * (2 * (1 * 1))))

等于

= 5 * 4 * 3 * 2 * 1 * 1