如何解释这个阶乘程序中的递归?

时间:2016-10-14 15:37:40

标签: javascript recursion

这是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]

1 个答案:

答案 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));

希望这有帮助