JavaScript-超过最大调用堆栈大小
我有一个练习要完成,我应该使用递归函数(基本函数) 我使用nodejs来避免在浏览器中使用JS控制台 当我在此处尝试此功能时:JavaScript-超过最大调用堆栈大小,javascript,recursion,Javascript,Recursion,我有一个练习要完成,我应该使用递归函数(基本函数) 我使用nodejs来避免在浏览器中使用JS控制台 当我在此处尝试此功能时: function factorial(n) { if (n === 0) { return 0; }else { return (n * factorial((n-1)*(n-1))); } } 所以当我尝试时:console.log(阶乘(0));它输出“0”。 当我尝试记录任何高于0的数字时,它会显示: 超出了最大调用堆栈大小 谢谢
function factorial(n) {
if (n === 0) {
return 0;
}else {
return (n * factorial((n-1)*(n-1)));
}
}
所以当我尝试时:console.log(阶乘(0));它输出“0”。
当我尝试记录任何高于0的数字时,它会显示:
超出了最大调用堆栈大小
谢谢。这是因为
factorial((n-1)*(n-1))
输入的n
超过2时,将返回更多的数字。因此,从那时起,它将是一个无限递归函数调用。但是,如果您将0、1或2放入,它将起作用
函数阶乘(n){
如果(n==0){
返回0;
}否则{
收益率(n*阶乘((n-1)*(n-1));
}
}
log(“fac0:+factorial(0));
console.log(“fac1:+factorial(1));
console.log(“fac2:+factorial(2));
console.log(“fac3:+factorial(3))代码>在下一次递归中,您需要将值减少一倍,而不是使用减少值的乘积
如果值为零,则需要返回一,因为
函数阶乘(n){
如果(n==0){
返回1;
}
返回n*阶乘(n-1);
}
console.log(阶乘(0));
console.log(阶乘(1));
console.log(阶乘(2));
console.log(阶乘(3));
console.log(阶乘(10))代码>通常递归函数要工作,需要有一个递归停止的基本情况。它还需要递归步骤比原始问题更简单,从而减少工作量,从而最终达到基本情况
看看你的代码:
function factorial(n) {
if (n === 0) {
return 0;
}else {
return (n * factorial((n-1)*(n-1))); // problem is here
}
}
它有一个基本情况,即当n
为零时返回0
。因此,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
顺便说一句,您好,是的,我现在明白了,否则它会做一个无限循环。谢谢你的回复!