我试图理解递归,并发现以下内容是对freecodecamp递归练习进行因子分解的答案。是正确的,但我不知道它是如何运行的。
很抱歉,如果这不是一个合适的问题,请首次使用。
function factorialize(num) {
if (num === 0) { return 1; }
return num * factorialize(num-1);
}
factorialize(5);
>120
答案 0 :(得分:5)
由于累加了递归函数的各个结果,因此可以通过以下方式想象这一过程:
当前值:5 *因式分解(4)
当前值:5 * 4 *因式分解(3)
当前值:5 * 4 * 3 *因式分解(2)
当前值:5 * 4 * 3 * 2 * factorialize(1)
当前值:5 * 4 * 3 * 2 * 1 *析因(0)
当前值:5 * 4 * 3 * 2 * 1 * 1
结果为120。
function factorialize(num) {
if (num === 0) { return 1; } // 7th step
return num * factorialize(num-1); // 1st to 6th step
}
答案 1 :(得分:1)
迭代编写函数可能有助于澄清问题;循环中的每一步等效于一个递归调用。
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)
,根据recursive definition of factorial,我们知道它是1
。 fact(0)
被称为基本情况,并且不会进行任何递归调用。如果没有基本情况,n
会越来越小,直到堆栈空间不足,导致程序崩溃。
有了基本案例的信息,fact(1)
现在可以计算1 * 1
并将结果1
传递到其调用函数fact(2)
。 fact(2)
计算2 * 1
并将结果传递到fact(3)
,后者计算3 * 2
并将结果传递给fact(4)
,后者计算4 * 6
并传递结果返回到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));