#javascript #recursion
#javascript #рекурсия
Вопрос:
Я изучаю рекурсию и нашел код, похожий на этот:
function repeat(operation, num) {
if (num < 1) return console.log('eee')
console.log(num)
return operation() * repeat(operation, num - 1)
}
function operation(){
console.log('lll')
}
repeat(operation, 5)
Если я запускаю, я получаю это:
5
lll
4
lll
3
lll
2
lll
1
lll
eee
Если я переключу последнюю строку следующим образом:
return repeat(operation, num - 1) * operation()
Я понимаю это:
5
4
3
2
1
eee
lll
lll
lll
lll
lll
Почему это? Что именно там делает multiply?
Комментарии:
1. пожалуйста, добавьте некоторые входные данные и желаемый результат.
2. Ваш исходный код не печатает то, что вы описываете для печати, вы, вероятно, случайно оставили автономный
operation()
перед возвратом.3.
console.log
возвращаетundefined
и не возвращает из функции, не даст числа .. это должны быть числа в numbers out, если вы собираетесь выполнять умножение на возвращаемое значение. в основномisNaN(NaN * NaN) === true
4. @AlexeyLebedev ты прав, я оставил дополнительную операцию (). исправил это сейчас
Ответ №1:
В вашем примере умножение не используется для умножения. Это используется как уловка для изменения порядка вызовов функций. Попробуйте заменить * на , и вы получите тот же результат.
Для демонстрации концепции:
function one(x){ console.log('one')}
function two(x){ console.log('two')}
one() * two()
// gives:
// one
// two
two() * one()
// gives:
// two
// one
результатом обоих выражений является NaN
ОБНОВЛЕНИЕ: выходные данные представляют порядок вызова функций. В первом случае repeat()
вызывается, operation()
затем repeat()
вызывает снова, пока num<1. Таким образом, вы получаете чередующийся вывод. Во втором случае вы вызываете repeat()
до num<1, затем выходите из рекурсии и вызываете operation()
несколько раз.
Комментарии:
1. О, я вижу, просто взлом… Вы также знаете, почему во втором примере сначала выполняется 5 раз repeat(), а не 5 раз operation() вместо alternate?