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

How to explain the recursion in this factorial program?

本文关键字:程序 阶乘 递归 何解释 解释      更新时间:2023-09-26

这是js中返回一个数字的阶乘的代码:为什么在下面给出的输出中首先打印'else met' ?N>0,因此应该打印"value is…"。有人能解释一下吗?

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]

要理解这一点,您应该对递归。无论如何,关于这段代码,递归使用堆栈,

factorial(5)变成了=factorial(4)*5,所以这里插入了factorial(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)在返回调用的堆栈中阶乘(0),在这里因为它不>0,会转到else然后先打印else满足条件并显示为"else满足"然后control返回到factorial(1)

现在factorial(1)变成1*1,从堆栈和控制中删除返回阶乘(2)

再次调用factorial(2)调用factorial(1),然后调用factorial(0)所以for factorial(2) print factorial(2)=>factorial(1)*2,Factorial (1)=> Factorial (0)*1 Factorial (0)=> else met并返回1现在control是factorial(1)它显示的值是1对于factorial(2),它将值显示为2

对factorial(3),4和5

继续相同的过程

但是递归是最糟糕的处理方法因为它每次都执行多个调用,所以您可以考虑使用这些值。我的意思是factorial(2)调用factorial(1)阶乘(0)阶乘(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));

希望能有所帮助