Как задать переменную в рекурсивной функции, чтобы она объявлялась лишь раз

Хочу включить счетчик в рекурсивную функцию, но не знаю возможно ли объявить ее лишь один раз, чтобы при остальных циклах функции она бы только инкрементировалась, не обнуляя значение.


Ответы (2 шт):

Автор решения: OPTIMUS PRIME

С функциями можно обращаться как с обычными объектами (они наследуют от Object).
В том числе, и хранить считалку как свойство:

bubu();

function bubu() {
  bubu.counter = (bubu.counter || 0) + 1;

  console.log(bubu.counter);
  
  if (bubu.counter < 10) bubu();
}

За счет логического ИЛИ ||, только на первой итерации, когда .counter — undefined (оно же, false), возьмется значение 0. Во всех остальных случаях - текущее значение counter.

Хотя, это можно организовать и так:

if (!bubu.counter) bubu.counter = 0;
bubu.counter++;

или

if (!++bubu.counter) bubu.counter = 0;

// !++undefined → !NaN → true
// !++0 → !1 → false
// !++1 → !2 → false
// ...

Либо передавай в качестве параметра (с) Grundy

bubu(0);

function bubu(i) {
  i++;
  console.log(i);
  
  if (i < 10) bubu(i);
}

P.s. Везде нужно обращать особое внимание, где инкрементируете считалку, и на чем она заканчивается, чтобы не ошибиться на +/-1 итерацию.

→ Ссылка
Автор решения: Руслан Исланбеков
function pow(x, n) {
  foo();
  return (n == 1) ? x : (x * pow(x, n - 1));
}

function foo () {

    if (typeof foo.counter == 'undefined') {
        foo.counter = 0;
    }
    foo.counter ++;
}

Попробуй этот код. Функция foo() имеет одну переменную счетчик. Функция не переопределяется при вызове из-за чего каждый раз просто инкрементируется.

→ Ссылка