Функции не вызываются из рекурсивных функций в JavaScript

#javascript #recursion

#javascript #рекурсия

Вопрос:

 function and(arr) {
  if (arr.length === 0) {
    return true;
  }

  const head = arr[0];
  const tail = arr.slice(1);

  return head amp;amp; and(tail);
}

and([true, true, false]);
 

У меня эта рекурсия вызывается 4 раза и в конце

 if (arr.length === 0) {
    return true;
  }
 

Я думал, что это закончится

Однако функция была вызвана только 3 раза !!

 head: [true]    tail: [true,false]
head: [true]    tail: [false]
head: [false]   tail: []
 

Это результат, который я проверил

   if (arr.length === 0) {
    return true;
  }
 

Это условие даже не сработало.

Мне нужна помощь.

Извините за использование переводчика

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

1. измените return head amp;amp; and(tail); на return and(tail); .

2. @cybercoder Тогда функция гарантированно вернется true , что противоречит всему смыслу функции.

3. @Aplet123 вопрос в том, сколько вызовов происходит при рекурсии! Поэтому он / она должен изменить тело функции, чтобы получить правильный ответ. Я сделал комментарий для руководства, а не для ответа!

Ответ №1:

В Javascript и многих других языках amp;amp; происходит короткое замыкание. Это означает, что если у вас есть a amp;amp; f() и a есть false , условие уже известно как ложное, поэтому f оно никогда не выполняется. Поскольку заголовок вашего массива находится false в третьем вызове, amp;amp; оператор закорачивает и возвращает false, даже не продолжая рекурсию. Если вы попытаетесь and([true, true, true]) , вы заметите, что он проходит весь путь до массива длиной 0, и ваше условие что-то сделает.