我正在这里开展一个小项目,我收到的消息是“过多的递归”,显然没有那么多。
这是相关的HTML代码
<div id="speed">
<label for="spe">Input speed</label>
<input type="text" id="spe" onkeydown="if (event.keyCode == 13){ javascript:CalcBySpeed(); return false; }" />
<input type="button" name="Sumbit" value="Submit" onclick="javascript:CalcBySpeed()" />
</div>
和一张表,通常看起来像这样:
<tr>
<td id="50">
<p id="117">5</p>
</td>
<td id="51">
<p id="118">20</p>
</td>
<td id="52">
<p id="119">5</p>
</td>
<td id="53">
<p id="120">1,2</p>
</td>
</tr>
我的JavaScript功能是:
function CalcBySpeed() {
var input = "a";
input = parseFloat(document.getElementById("spe").value) * 100;
if (input < 5089) {
getValueBySpeed(input - 3);
} else {
alert("Value undefined!");
}
};
function getValueBySpeed(input) {
if (document.getElementById(input) != null) {
document.getElementById(input).style.backgroundColor = "yellow";
document.getElementById(input + 1).style.backgroundColor = "yellow";
document.getElementById(input + 2).style.backgroundColor = "yellow";
document.getElementById(input + 3).style.backgroundColor = "yellow";
document.getElementById("res1").innerHTML = document.getElementById(input + 3).innerHTML;
document.getElementById("res2").innerHTML = document.getElementById(input + 2).innerHTML;
document.getElementById("res3").innerHTML = document.getElementById(input + 1).innerHTML;
document.getElementById("res4").innerHTML = document.getElementById(input).innerHTML;
} else {
getValueBySpeed(input++);
}
}
所以如果我决定输入我的输入字段:
1.2
,js成功突出显示此特定行1.19
js成功突出显示同一行0.97
js成功突出显示同一行但是当我输入时:
1.1
它会在控制台too much recursion
我相信当我输入0.97
时会有更多的递归,但问题是当我在1.09
和1.16
之间输入数字时。
在这个范围之外似乎没有问题。
答案 0 :(得分:8)
显然没那么多。
显然有;)
您的代码可能存在错误:
function getValueBySpeed(input) {
if (document.getElementById(input) != null) {
...
}
else {
getValueBySpeed(input++);
}
}
如果document.getElementById(input) != null
为false
,则可能会保留false
,并且在您收到递归错误之前将调用函数getValueBySpeed
。
作为一个小注:我不明白getValueBySpeed
的作用,名称很奇怪,论证很奇怪,实现很奇怪。
我希望(根据名字):
function getValueBySpeed(speed) {
var value;
value = // get value somehow
return value;
}
答案 1 :(得分:1)
后缀增量返回原始值,因此您使用相同的值重复调用函数。也就是说,你不需要递归,使用循环。这是一个粗略的尝试,但你的代码对我来说没什么意义,所以我可能弄错了...
function CalcBySpeed()
{
var input = "a";
input = parseFloat(document.getElementById("spe").value)*100;
if (input < 5089) {
getValueBySpeed(input-3);
} else {
alert("Value undefined!");
}
};
function getValueBySpeed(input) {
while (document.getElementById(input) == null)
input++;
document.getElementById(input).style.backgroundColor = "yellow";
document.getElementById(input + 1).style.backgroundColor = "yellow";
document.getElementById(input + 2).style.backgroundColor = "yellow";
document.getElementById(input + 3).style.backgroundColor = "yellow";
document.getElementById("res1").innerHTML = document.getElementById(input + 3).innerHTML;
document.getElementById("res2").innerHTML = document.getElementById(input + 2).innerHTML;
document.getElementById("res3").innerHTML = document.getElementById(input + 1).innerHTML;
document.getElementById("res4").innerHTML = document.getElementById(input).innerHTML;
}
答案 2 :(得分:0)
这是一个四舍五入的问题。 1.1 * 100 = 110.00000000000001
。然后,当您为每个呼叫添加1时,该数字永远不会是整数。永远不会找到标识为xxxx.00000000000001
的元素。
问题的根源是1.1无法用双精度浮点数精确表示。
解决方案是将数字转换为整数。我忽略了小数值。