Почему этот пример рекурсии дает мне бесконечный цикл?

#javascript #algorithm #recursion

#javascript #алгоритм #рекурсия

Вопрос:

Это сводит меня с ума. Вот код :

 function laugh(){
  let counter = 10; 
  if(counter <= 0){
    return;
  } 
  else{
    console.log('laugh'); 
    counter--; 
    laugh()
  }
}
 

Почему это дает мне бесконечный цикл, когда он должен печатать ‘laugh’ 10 раз?

Комментарии:

1. Вы должны определить counter вне функции. таким образом, его всегда 10.

Ответ №1:

Как и в других ответах, каждый laugh() из них создал новый локальный счетчик.

Наиболее подходящий рекурсивный метод здесь — передать счетчик в качестве аргумента:

 function laugh(counter){
  if(counter <= 0){
    return;
  } 
  else{
    console.log('laugh'); 
    laugh(counter - 1) // subtract 1 from the counter and recur
  }
}

laugh(10) 

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

Ответ №2:

Вы определили счетчик внутри функции, поэтому он будет сбрасываться на 10 при каждом вызове функции.

 let counter = 10; 
function laugh(){
  if(counter <= 0){
    return;
  } 
  else{
    console.log('laugh'); 
    counter--; 
    laugh();
  }
}
laugh(); 

Ответ №3:

переменная counter должна быть глобальной переменной. В этот момент, всякий раз, когда вызывается функция, then counter всегда будет объявлен и инициализирован 10 .