Инкремент (i ++) и (i + = 1) в рекурсивном вызове Javascript

1

У меня вопрос о приращении JS (++). Я знаю, что многие люди здесь задавали вопрос о ++ и +1 различиях в JS, но ни один из них не упоминал об этом в рекурсивном вызове.

ВОПРОС: Я хочу вызывать функцию exec внутри функции exec рекурсивно, но текущий сценарий не работает.

var exec = function(index){
    if(index<7){
        exec(index++);
    }
}
exec(0);

output: Uncaught RangeError: Maximum call stack size exceeded

Поэтому я сменил свой сценарий на ниже, и он работал хорошо.

var exec = function(index){
    if(index<7){
        exec(index+=1);
    }
}
exec(0);

Почему в этом примере он действует как различие? Является ли мой рекурсивный звонок неправильным?

  • 3
    Это похоже на вопрос о постинкременте против преинкремента ++i против i++ . Если вы пытаетесь ++i это должно работать.
  • 1
    В этом случае вы, вероятно, должны просто использовать i+1
Показать ещё 2 комментария
Теги:
recursion
increment

2 ответа

3
Лучший ответ

index++ - это приращение. Это означает, что он увеличивает эту переменную, но значение выражения - это старое значение. Так:

exec(index++);

эквивалентно:

var oldindex = index;
index += 1;
exec(oldindex);

Таким образом, рекурсивный вызов использует старое значение, что означает, что вы продолжаете называть рекурсивно с тем же значением и никогда не попадаете в предел, который перестает рекурсировать.

Вам нужно использовать pre-increment, который увеличивает эту переменную и возвращает новое значение:

exec(++index);

На самом деле, нет причин для приращения переменной вообще, так как вы никогда не используете ее снова в этой функции. Просто делать:

exec(index + 1);
1

Проблема с index++ заключается в том, что она является пост-инкрементом, поэтому она только увеличивает значение index после того, как оно уже было передано обратно в exec. Использование pre-increment (++index) должно работать, так как оно будет увеличивать его до передачи его в рекурсивный вызов.

var exec = function(index){
    console.log(index)
    if(index<7){
        exec(++index);
    }
}
exec(0);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню