为什么这不给我阶乘?

Why doesn't this give me the factorial?

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

  console.log(FirstFactorial(8))

我只是想知道为什么我这样写代码不会打印阶乘?相反,我只得到 56,即 8 * 7。我认为如果我使用 for 循环,它会继续运行吗?

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

示例:

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 时,它会中止方法调用并 return 到具有你 return 的值(如果有)的父级。所以在你的情况下,它将 return 8 * 7 = 56

你 return 你在循环中第一次迭代时的值,而不是在循环结束时。这应该可以解决问题:

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

  console.log(FirstFactorial(8))

你正在传递 8 并乘以 8*7 和 return 56。你没有积累。这里需要一些递归:

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

使用:

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

它将return num*(num-1)值。因为它将 return 第一次迭代中的值。

改为使用:

使用递归:

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 如何在递归方法中工作。

关于递归:

return num*FirstFactorial(num-1)

实际上首先将 num 乘以 FirstFactorial(num-1) 的 return 值,即 (n-1)!。因此实际会发生的是:

  1. FirstFactorial(num-1) 被调用。 (使用参数 num-1.
  2. 调用 FirstFactorial 函数
  3. FirstFactorial(num-1)的return值即(num-1)!乘以num的值得到num!.
  4. 当使用参数 numFirstFactorial(num)
  5. 传递时,此值 (num!) 然后由函数 FirstFactorial() 编辑 return

现在在 FirstFactorial(num) 中调用 FirstFactorial(num-1) 时,将再次执行 FirstFactorial 函数检查第一个 if 条件。如果失败,它将return (n-1)*FirstFactorial(num-1 - 1) 的值。这将递归直到第一个如果条件满足并且值被 returned 而无需再次调用 FirstFactorial

你也可以认为这个函数是:

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

你的 for 循环正在迭代一次,因为有一个 return,你应该存储在一个变量中,并且在循环迭代后 return。

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;
    }
}