javascript - 递归触发错误 "Maximum call stack size exceeded error"

标签 javascript recursion max

调用此递归 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');
}

我怎样才能弄清楚这一点?

最佳答案

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

关于javascript - 递归触发错误 "Maximum call stack size exceeded error",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36145261/

相关文章:

list - 我对 Haskell 'length' 函数的重新定义不起作用

php - 在第一级和第二级之后不保存递归帮助更改

c++ - 从 C++ 中的整数数组中获取最大数

r - 提取R中字符向量中的所有最大长度值

javascript - 415(不支持的媒体类型)与 REST 发布请求

javascript - 使用 javascript 创建 Instagram 风格的过滤器?

recursion - RavenDB 和分层文档

mysql - 比较两个 MySQL 表之间的最高值

javascript - i18next - 在 data-i18n-options 属性中提供用于插值的键

javascript - 如何在 JSF 中实现复制到剪贴板按钮?