#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, и ваше условие что-то сделает.