我有一个练习要完成,我应该使用递归函数(基本函数)。
我正在使用nodejs以避免在浏览器中使用JS控制台。
当我在这里尝试此功能时:
function factorial(n) {
if (n === 0) {
return 0;
}else {
return (n * factorial((n-1)*(n-1)));
}
}
所以当我尝试时:console.log(factorial(0));输出“ 0”。 当我尝试记录任何大于0的数字时,它会显示:
已超过最大调用堆栈大小。
谢谢。
答案 0 :(得分:0)
这是因为,当您输入factorial((n-1)*(n-1))
超过2时,n
将返回更多的数字。因此,从那时起,它将是一个无限递归函数调用。但是,如果您输入0、1或2,它将起作用。
function factorial(n) {
if (n === 0) {
return 0;
}else {
return (n * factorial((n-1)*(n-1)));
}
}
console.log("fac0: "+factorial(0));
console.log("fac1: "+factorial(1));
console.log("fac2: "+factorial(2));
console.log("fac3: "+factorial(3));
答案 1 :(得分:0)
您需要在下一次递归时将值减少一个,而不是取减少值的乘积。
由于0!
的定义,如果值为零,则需要返回1。
function factorial(n) {
if (n === 0) {
return 1;
}
return n * factorial(n - 1);
}
console.log(factorial(0));
console.log(factorial(1));
console.log(factorial(2));
console.log(factorial(3));
console.log(factorial(10));
答案 2 :(得分:0)
通常,要使递归函数起作用,它需要具有递归停止的基本情况。它还需要比原始问题更简单的递归步骤,从而减少工作量,从而最终达到基本要求。
因此,请看一下您的代码:
function factorial(n) {
if (n === 0) {
return 0;
}else {
return (n * factorial((n-1)*(n-1))); // problem is here
}
}
它有一个基本情况,当0
为零时,它返回n
。因此factorial(0) // ==> 0
。现在说我们用3
来尝试。
factorial(3); // ==
3 * factorial((3-1)*(3-1)); // ==
3 * factorial(4); // ==
3 * 4 * factorial((4-1)*(4-1)); // ==
3 * 4 * factorial(9); // ==
要求递归是一个更简单的问题。 factorial(4)
并不比factorial(3)
简单,因此这种递归永远不会达到基本情况。
如果要实现factorial
,则基本情况应返回1
而不是0
,并且递归总是比当前值小一。 factorial(2)
是一个比factorial(3)
更简单的问题,因为它将使基本情况变热,结果是3 * 2 * 1 * 1
。