为什么这不是阶乘呢?
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循环,它会一直运行下去吗?
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)
实际上首先将num
与FirstFactorial(num-1)
的返回值(n-1)!
相乘。因此实际会发生的是:
- 调用
-
FirstFactorial(num-1)
。(FirstFactorial函数使用参数num-1
调用。 - 将
FirstFactorial(num-1)
的返回值(即(num-1)!
)与num
的值相乘得到num!
。 - 当与参数
num
或FirstFactorial(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;
}
}
相关文章:
- 你能解释一下这个阶乘函数是如何工作的吗?
- 如何对单个页面进行密码保护(这不是身份验证系统的一部分)
- 计算阶乘超过了Javascript中的最大整数限制
- 为什么jQuery掩码说它'It’这不是函数
- NodeJS,通过socket控制台发送缓冲区后表示'这不是缓冲区
- 图像加载,IE中的另一个错误 - 相当确定这不是缓存错误
- Chrome 如何获取 gist json 文件?这不是被禁止的吗
- 如何将一个 JavaScript 文件包含在另一个 JavaScript 文件中 这不是从浏览器中运行的
- 使用 .reduce() 对数字进行阶乘化
- 使用 VBScript 函数的阶乘
- 为什么这不是一个javascript闭包
- JavaScript 中的阶乘.不行
- 递归函数 - 计数如何存储在此阶乘解决方案中
- 如何在下面修复此错误,说明这不是一个函数
- 我收到“这不是函数”错误
- JavaScript 阶乘递归
- 阶乘的最小有效非零位
- 如何阶乘只有 5 个数字
- Javascript,阶乘,太难了
- 为什么这不是阶乘呢?