我试图理解递归,并发现下面的答案是一个免费的freecodecamp递归练习,以因式化一个数字。这是正确的,但我不明白它是如何运行的。
抱歉,如果这不是一个合适的问题,第一次使用。
function factorialize(num) {
if (num === 0) { return 1; }
return num * factorialize(num-1);
}
factorialize(5);
>120发布于 2018-07-19 22:49:22
由于递归函数的单个结果是累积的,因此可以通过以下方式来想象这个过程:
这导致120人死亡。
function factorialize(num) {
if (num === 0) { return 1; } // 7th step
return num * factorialize(num-1); // 1st to 6th step
}发布于 2018-07-19 23:18:29
迭代编写函数可能有助于澄清问题;循环中的每个步骤都相当于一个递归调用。
function factorialize(num) {
let factorial = 1; // base case, equivalent to fact(0)
for (let i = 1; i <= num; i++) { // multiply for each number from 1 to n
factorial *= i;
}
return factorial;
}
console.log(factorialize(5));
递归函数的工作方式是相同的。fact(n)是最初的调用,但是要计算fact(n),它必须首先计算n - 1的阶乘。没有fact(n - 1)就无法计算fact(n - 2)。每个函数都被推到调用堆栈上,等待上面的函数解析。最终将调用fact(0),我们知道这是基于阶乘的递归定义的1。fact(0)被称为基本情况,不会进行任何递归调用。如果没有基本情况,n会变得越来越小,直到堆栈耗尽空间,导致程序崩溃。
fact(1)现在可以使用来自大小写的信息计算1 * 1并将结果1传递给其调用函数fact(2)。fact(2)计算2 * 1并将结果传递给fact(3),fact(3)计算3 * 2并将结果传递给fact(4),fact(4)计算4 * 6并将结果传递给fact(5),fact(5)计算5 * 24并返回120的最终结果。
如果这仍然没有意义,那么抛出一个console.log()来查看整个过程中的每一步:
function factorialize(num) {
if (num === 0) { // base case
console.log("fact(0) returning 1");
return 1;
}
// recursive case
const result = num * factorialize(num - 1);
console.log("fact(" + num + ") returning " + result);
return result;
}
console.log(factorialize(5));
https://stackoverflow.com/questions/51432544
复制相似问题