为什么这不给我阶乘?
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)!
。因此实际会发生的是:
FirstFactorial(num-1)
被调用。 (使用参数 num-1
. 调用 FirstFactorial 函数
FirstFactorial(num-1)
的return值即(num-1)!
乘以num
的值得到num!
.
- 当使用参数
num
或 FirstFactorial(num)
传递时,此值 (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;
}
}
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)!
。因此实际会发生的是:
FirstFactorial(num-1)
被调用。 (使用参数num-1
. 调用 FirstFactorial 函数
FirstFactorial(num-1)
的return值即(num-1)!
乘以num
的值得到num!
.- 当使用参数
num
或FirstFactorial(num)
传递时,此值 (
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;
}
}