2014-01-16 9 views
0

Я работаю над небольшим проектом здесь, и я получаю это сообщение «слишком много рекурсии», когда явно не так много.Почему возникает ошибка «Слишком много рекурсии»?

Это соответствующий 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

Это проблема округления. '1.1 * 100 = 110.00000000000001'. Затем, когда вы добавляете 1 для каждого вызова, число никогда не будет целым. Элемент с id 'xxxx.00000000000001' никогда не будет найден. –

+0

Всякий раз, когда вы используете рекурсию, не забывайте о состоянии завершения. – Givi

+1

@SaniHuttunen, спасибо! Я проанализировал «ввод» на целое число, и теперь он работает правильно! Опубликуйте свой комментарий в качестве ответа, поэтому я могу выбрать его как «Лучший ответ»: d – user2997637

ответ

0

Это проблема округления.1.1 * 100 = 110.00000000000001. Затем, когда вы добавляете 1 для каждого вызова, число никогда не будет целым. Элемент с id xxxx.00000000000001 никогда не будет найден.

Корень проблемы состоит в том, что 1.1 нельзя точно представить с помощью чисел с плавающей запятой с двойной точностью.

Решение представляет собой преобразование числа в целое число. I. Не учитывайте десятичное значение.

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

Приращение постфикса возвращает исходное значение, так что вы вызываете вашу функцию несколько раз с тем же значением. Тем не менее, вам не нужна рекурсия, используйте цикл. Вот грубая попытка, но ваш код мало смысла для меня, так что я, возможно, получил это неправильно ...

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; 
} 
+0

Вы ошибаетесь в отношении приращения постфикса. –

+0

И ваш код по-прежнему имеет ошибку округления. –

+0

@SaniHuttunen: Я не ошибаюсь в отношении приращения postfix. http://jsfiddle.net/AwRE3/1/ –

Смежные вопросы