为什么我会收到错误“太多的递归”?

时间:2014-01-16 16:48:20

标签: javascript html firefox recursion

我正在这里开展一个小项目,我收到的消息是“过多的递归”,显然没有那么多。

这是相关的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.091.16之间输入数字时。

在这个范围之外似乎没有问题。

3 个答案:

答案 0 :(得分:8)

  

显然没那么多。

显然有;)

您的代码可能存在错误:

function getValueBySpeed(input) {
    if (document.getElementById(input) != null) {
        ...
    }
    else {
        getValueBySpeed(input++);
    }
}

如果document.getElementById(input) != nullfalse,则可能会保留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无法用双精度浮点数精确表示。

解决方案是将数字转换为整数。我忽略了小数值。