Что такое умножение в рекурсии?

#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?