为什么这不能给我阶乘?

时间:2015-07-08 07:13:21

标签: javascript for-loop factorial

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

  console.log(FirstFactorial(8))

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

6 个答案:

答案 0 :(得分:1)

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

示例:

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

答案 1 :(得分:1)

你传球8并乘以8 * 7并返回56.你没有累积。你需要一些递归:

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

答案 2 :(得分:1)

使用:

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)被调用。 (使用参数num-1调用FirstFactorial函数。
  2. FirstFactorial(num-1)的{​​{1}}的返回值乘以(num-1)!的值,以获得num
  3. 当使用参数num!num!
  4. 传递时,函数FirstFactorial()会返回此值(num

    现在在FirstFactorial(num)内调用FirstFactorial(num-1)时,将再次执行FirstFactorial函数,检查第一个if条件。如果失败,则返回FirstFactorial(num)的值。如果满足条件并且在不再次调用(n-1)*FirstFactorial(num-1 - 1)的情况下返回值,则将递归到第一个。

    您还可以将该功能视为:

    FirstFactorial

答案 3 :(得分:0)

尝试类似:

Stacktrace:
    ReferenceError: before is not defined
    at [object Object].<anonymous> (/myApp/tests/e2e/routes.js:10:5)
    at normalLoader (/myApp/node_modules/babel-core/lib/babel/api/register/node.js:160:5)
    at Object.require.extensions.(anonymous function) [as .js] (/myApp/node_modules/babel-core/lib/babel/api/register/node.js:173:7)
    at require (module.js:380:17)
    at Function.promise (/myApp/node_modules/protractor/node_modules/q/q.js:650:9)
    at _fulfilled (/myApp/node_modules/protractor/node_modules/q/q.js:797:54)
    at self.promiseDispatch.done (/myApp/node_modules/protractor/node_modules/q/q.js:826:30)
    at Promise.promise.promiseDispatch (/myApp/node_modules/protractor/node_modules/q/q.js:759:13)
    at /myApp/node_modules/protractor/node_modules/q/q.js:525:49
    at flush (/myApp/node_modules/protractor/node_modules/q/q.js:108:17)
    at process._tickCallback (node.js:419:13)

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

答案 4 :(得分:0)

您在第一次循环迭代时返回值,而不是在结束时。这应该可以解决问题:

var

答案 5 :(得分:0)

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

function factorial(num) {
    var result = num;

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

    return result;
}

注意factorial是递归的候选者:

function factorial(num) {

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