有人可以向我解释这段代码是如何工作的吗?

时间:2017-08-24 11:18:59

标签: javascript

所以,一位朋友向我分享了关于阶乘的代码,我很难理解它是如何提供正确的结果,因为它没有通过循环。如果有人可以向我解释,就像我5岁那样,我真的很感激。

function fact(n){
   if(n === 1){
     return 1;
   }else{
     return n * fact(n - 1);
   };
};
console.log(fact(5));

3 个答案:

答案 0 :(得分:0)

代码是一个递归函数调用,用于获取数字的阶乘。

function fact(n){ // function declaration
   if(n === 1){ //strict type check if n is an integer 1 not a '1'
     return 1; // return back 1
   }else{  // if n is not 1 
     return n * fact(n - 1); //return the number n multiplied by the function call fact again in which the parameter is n-1 now.
   };
};
console.log(fact(5)); //print the result of function call fact(5) and print it to console.

function fact(n){
   if(n === 1){
     return 1;
   }else{
     return n * fact(n - 1);
   };
};
console.log(fact(5));

这是一个根据数学公式运行的调用来计算阶乘:

n * (n-1) !

答案 1 :(得分:0)

关于阶乘的属性,n!可以写为n * (n-1) !。 也就是说,n的函数的结果可以通过n乘以n-1的函数的结果来获得,依此类推为1!:

function factorial(n) {
  return (n != 1) ? n * factorial(n - 1) : 1;
}

alert( factorial(5) ); // 120

递归基础是值1.你可以创建基础和0.然后代码会更短:

function factorial(n) {
  return n ? n * factorial(n - 1) : 1;
}

alert( factorial(5) ); // 120

在这种情况下,通话factorial (1)会缩减为1 * factorial (0),还会有一个额外的递归步骤。

答案 2 :(得分:0)

当谈到递归时,你可以把它看作一个调用自身的函数;在这种情况下

function fact(n){
    //test to see if n is 1, if so just return 1
    if(n === 1)
        return 1;
    // multiply n by the result of calling fact(n-1)
    return n * fact(n - 1);
}

console.log(fact(5));

所以在这种情况下,当你调用fact(5) 你会得到的 5 *事实(5-1)= 4 *事实(4-1)= 3 *事实(3-1)= 2 *事实(2-1)= 1

导致5 * 4 * 3 * 2 * 1 = 120

首先要弄清楚这个概念有点棘手,尝试将一个console.log插入到该函数中,以便更清楚地了解正在发生的事情。

function fact(n){
    console.log(n);
    //test to see if n is 1, if so just return 1
    if(n === 1)
        return 1;
    // multiply n by the result of calling fact(n-1)
    return n * fact(n - 1);
}