这是js中的代码,它返回数字的阶乘: 为什么'else met'首先打印在下面给出的输出中? n> 0,因此应打印“值为......”。有人可以解释一下吗?
function factorial(n) {
if (n>0){
console.log("value is "+n*factorial(n-1));
return n * factorial(n-1);
}
else{
console.log("else met");
return 1;
}
}
console.log(factorial(5));
这是输出:
else met
value is 1
else met
value is 2
else met
value is 1
else met
value is 6
else met
value is 1
else met
value is 2
else met
value is 1
else met
value is 24
else met
value is 1
else met
value is 2
else met
value is 1
else met
value is 6
else met
value is 1
else met
value is 2
else met
value is 1
else met
value is 120
else met
value is 1
else met
value is 2
else met
value is 1
else met
value is 6
else met
value is 1
else met
value is 2
else met
value is 1
else met
value is 24
else met
value is 1
else met
value is 2
else met
value is 1
else met
value is 6
else met
value is 1
else met
value is 2
else met
value is 1
else met
120
[Finished in 0.3s]
答案 0 :(得分:1)
要理解这一点,你应该有一个基本的了解 递归。无论如何,关于这段代码Recursion使用stack,
阶乘(5)变为=阶乘(4)* 5,所以这里插入阶乘(5) 进入堆栈,然后调用
factorial(4)= factorial(3)* 4,因此factorial(4)被插入堆栈 然后又调用
factorial(3)= factorial(2)* 3,现在factorial(3)在堆栈中 intun调用
facotrial(2)= factorial(1)* 2,现在factorial(2)在堆栈中 转移电话 factorial(1)= factorial(0)* 1,现在factorial(1)处于堆栈中,用于调用 factorial(0),这里因为它不是> 0,所以转到else 部分然后首先打印else满足条件并显示为“else met”然后控制返回到factorial(1)
现在factorial(1)变为1 * 1,从堆栈和控制中删除 返回到factorial(2)
再次factorial(2)调用factorial(1)然后调用factorial(0) 所以对于阶乘(2)打印阶乘(2)=>阶乘(1)* 2, factorial(1)=> factorial(0)* 1 factorial(0)=>否则遇到并返回1 现在控制是阶乘(1)它显示值为1现在控制是 使用factorial(2),它显示值为2
相同的过程继续使用阶乘(3),4和5
但是递归是对于fibnocci来说最糟糕的过程 因为它每次都会进行多次调用,相反,你可以 想想使用这些价值观。我的意思是factorial(2)调用factorial(1) 和factorial(0)factorial(3)也调用这些并重新计算 相反,它可以使用现有值 尝试看一下动态编程方法。 以下是使用动态方法的阶乘代码片段,速度更快
var fact=new Array(5);
fact[0]=1;
fact[1]=1;
function Factorial(n){
for(var i=2;i<=n;i++)
{
fact[i]=i*fact[i-1];
}
return fact[n];
}
console.log(Factorial(5));
希望这有帮助