为什么这不是阶乘呢?

Why doesn't this give me the factorial?

本文关键字:阶乘 这不是 为什么      更新时间:2023-09-26
function FirstFactorial(num) { 
      for(var i = num - 1; i > 0; i--) {
           return num * i; 
      }        
    };
  console.log(FirstFactorial(8))

我只是想知道为什么像这样写代码不打印阶乘?结果是56,也就是8 * 7。我想如果我使用for循环,它会一直运行下去吗?

Using:

for(var i = num - 1; i > 0; i--) {
    return num * i; 
}

返回num*(num-1)值。因为它将在第一次迭代中返回值。

而不是使用:使用递归:

function FirstFactorial(num) {
    if(num==1)
        return num;
    else
        return num*(FirstFactorial(num-1))
}

或:

fact=num;
for(var i = num - 1; i > 0; i--) {
    fact*=i; 
}
return fact;

编辑:根据OP的要求解释返回值如何在递归方法中工作。

关于递归:

return num*FirstFactorial(num-1)

实际上首先将numFirstFactorial(num-1)的返回值(n-1)!相乘。因此实际会发生的是:

    调用
  1. FirstFactorial(num-1)。(FirstFactorial函数使用参数num-1调用。
  2. FirstFactorial(num-1)的返回值(即(num-1)!)与num的值相乘得到num!
  3. 当与参数numFirstFactorial(num)一起传递时,该值(num!)由函数FirstFactorial()返回

现在在FirstFactorial(num)内部调用FirstFactorial(num-1)时,FirstFactorial函数将再次执行检查第一个if条件。如果失败,它将返回(n-1)*FirstFactorial(num-1 - 1)的值。如果条件满足并且返回值,则此操作将递归到第一次,而无需再次调用FirstFactorial

你也可以把这个函数想成:

function FirstFactorial(num) {
    if(num==1)
        return num;
    else {
        a = FirstFactorial(num-1);
        a = a * num;
        return a;
    }
}

传递8并乘以8*7并返回56。你不是在积累。这里需要一些递归:

function FirstFactorial(num)
{
    if (num == 1)
        return num;
    else
        return num * FirstFactorial(num - 1);
}

当你使用return时,它会转义函数并返回第一个num*i,为了防止它,在函数中创建一个局部变量并在循环结束时返回它。

例子:

function FirstFactorial(num) {
    var result=1;
    for(var i = num - 1; i > 0; i--) {
        result *= i; 
    }        
    return result
};

试试这样写:

function FirstFactorial(num) { 
  var fact = 1;
  for(var i = num; i > 0; i--) {
       fact = fact * i; //here you are returning on your first iteration iteslef and hence issue
  }
  return fact;        
};
console.log(FirstFactorial(8))

当您说return时,它将中止方法调用并返回您返回的值(如果它返回)到父进程。在你的例子中,它会返回8 * 7 = 56

在循环中第一次迭代时返回值,而不是在最后。这应该能奏效:

function FirstFactorial(num) { 
      var result = num;
      for(var i = num - 1; i > 0; i--) {
           result = result * i; 
      }
      return result;        
    };
  console.log(FirstFactorial(8))

for循环只迭代一次,因为有一个返回值,所以应该存储在一个变量中,并在循环迭代后返回。

function factorial(num) {
    var result = num;
    for (var i = num - 1; i > 0; i--) {
        result = result * i;
    }
    return result;
}

注意阶乘是递归的候选项:

function factorial(num) {
    if (num > 0) {
        return num * factorial(num - 1);
    } else {
        return 1;
    }
}