【问题标题】:Recursion triggers the error "Maximum call stack size exceeded error"递归触发错误“超出最大调用堆栈大小错误”
【发布时间】:2016-03-22 02:38:47
【问题描述】:

调用此递归 JavaScript 时出现错误“超出最大调用堆栈大小错误”。

这是我的代码:

var num = 12
,maxlength = 50;
var lengths = [5,6,7,8,4,4,5,6,3,3,2,2];

function knap(maxlength,num){
	if(maxlength==0) return 1;
	if(maxlength<0||(maxlength>0&&num<1)){
		return 0;
	}

	if(knap(maxlength-lengths[num],num-1)){
		console.log(lengths[num]+" ")
		return 1;
	}

	return knap(maxlength,num-1);
}

if(knap(maxlength,num)){
	console.log('Yes');
}else{
	console.log('No');
}

我怎么知道这个?

【问题讨论】:

  • 没有什么要弄清楚的,你有一个无限期调用自己的函数,你传入50所以没有一个if语句是真的,它走到最后,再次调用这个函数与50 相同的事情再次发生。
  • 你得到终止条件了吗?最大长度始终相同
  • 啊哈,在第一次迭代 maxlength eq NaN 之后。 :) 所以终止条件总是错误的。
  • 只是好奇,你能(非正式地)描述一下你的函数应该做什么吗?
  • 彼得,恕我直言,如果您在函数体的第一个字符串中插入 console.log(maxlength,num) 之类的内容,您将花费更少的时间来解决这个问题。 :)

标签: javascript recursion max


【解决方案1】:

当你第一次调用你的函数时,num 的值超过了 lengths 数组的长度。所以if(knap(maxlength-lengths[num],num-1)) 中的表达式maxlength-lengths[num] 是NaN。在那之后,你所有的中断递归条件总是错误的。 因此,您可能需要以knap(maxlength,num-1) 进行第一次呼叫。

【讨论】:

  • 谢谢您,您的帮助最大!
【解决方案2】:

这意味着在您的代码中的某个地方,您正在调用一个函数,该函数又调用另一个函数等等,直到您达到调用堆栈限制并且大部分时间是因为递归。

Maximum call stack size exceeded error

【讨论】:

    猜你喜欢
    • 2015-02-06
    • 2023-02-04
    • 2011-08-31
    • 1970-01-01
    • 2019-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-15
    相关资源
    最近更新 更多