[英]Javascript: too much recursion error
我一直在从事这个项目,并且已经设置了以下数组:
var myArray = {};
myArray[idNumber] = parentIdNumber;
每个成员只能有一个或没有一个父代,用0表示。我最多可以填写70个值。
我收到一个值input
,需要检查数组的每个成员是否在input
的“族系”中。
因此,我遍历myArray
并调用isInFamilyLine(currentObject, 37)
,其中currentObject
的范围为1-70:
function isInFamilyLine(idNumber, input) {
if (idNumber== input) {
isInLine = true;
} else {
if (myArray[idNumber] == 0) {
isInLine = false;
} else {
isInLine = isInFamilyLine(myArray[idNumber], input);
}
}
return isInLine;
}
我认为逻辑是正确的,但是我看到的大多数递归过多的示例都涉及代码中的错误。
还奇怪的是,在这一行上引发了too much recursion
错误:
if (myArray[idNumber] == 0) {
有任何想法吗?
给定您的代码,由于错误的输入,可能发生的事情是什么,除了您下次调用isInFamilyLine
,什么也不会执行,该调用也传递了错误的参数,从而引起了对自身广告的新调用。
如果myArray
是关联数组,则需要确保要传递的键的值具有正确的类型。 您还需要检查传递给函数的内容是否符合您的要求,并且数组没有任何越界问题。
我看到两个可能的问题:
input
(感谢IvyLynx ) isInFamilyLine(x, "peanuts")
导致无限递归,因为对于x != "peanuts"
的任何合理值, x
x != "peanuts"
,并且myArray["peanuts"] != 0
因为undefined != 0
。 这导致该行始终被称为:
isInLine = isInFamilyLine(myArray[idNumber], input);
所以我们有一个无限循环。 解决方案是检查myArray[input] === undefined
,然后引发错误并询问用户新值。 这也可以确保输入在预期范围内。
请注意,因为Javascript的类型很弱,并且您使用==
而不是===
,所以"2" == 2
,因此接收输入数字作为字符串不应成为问题的根源。
如果myArray[x] == [x]
对于任何x
此代码也将进入无限递归。 您假定这些值是非循环的,但这可能不是正确的。 例如,任何大小的循环都会发生相同的问题
myArray[1] = 2
myArray[2] = 3
myArray[3] = 1
如果只有70个值,一个简单的解决方案是记住您访问过哪些成员,并且两次访问同一成员都会引发错误。 或者,您可以在接受任何输入之前运行检查,请参阅如何检查有向图是否为非循环的 。
PS:我不确定,但我认为此算法等效于验证树中的每个节点是否都可以到达或可以到达给定的输入节点。 将数据建模为实际树并使用标准图形算法可能会有所帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.