Во-первых, давайте уточним, что если вы запустите repeater(addOne, 3)
, вы получите только функцию. Вам нужно будет запустить repeater(addOne, 3)(SomeOtherInteger)
, чтобы получить целочисленное значение и результат ваших вычислений. Все, что здесь делает рекурсия, - это создание функции. repeater(addOne, 3)
возвращает функцию, которая принимает целое число и возвращает целое число. Возьмите пример repeater(addOne, 3)
, если мы полностью запишем результат рекурсии, это то, что мы получим
{ x => {x => { x => { x => x }(myFunc(x)) }(myFunc(x)) }(myFunc(x))) }
Это может показаться немного запутанным, но давайте разберемся с этим.
Позволяет сосредоточиться на самой внутренней части - { x => x }(myFunc(x))
. Это может быть разделено на две части, функцию и вход в функцию. Функция { x => x }
и вход для этой функции (myFunc(x))
. В этом случае все, что делает функция, это возвращает ввод обратно пользователю. Таким образом, если мы напишем { x => x }(1)
, мы получим 1
. Таким образом, мы можем заменить все { x => x }(myFunc(x))
просто myFunc(x)
. То, что у нас осталось, это
{ x => { x => { x => myFunc(x) }(myFunc(x)) }(myFunc(x)) }
Давайте посмотрим на { x => myFunc(x)}(myFunc(x))
термин. Здесь функциональной частью является { x => myFunc(x) }
, а вход для этой функциональной части задается (myFunc(x))
. Часть функции принимает целое число x
и применяет myFunc
к этому целому числу. По сути, это то же самое, что применение myFunc
непосредственно к этому целому числу. В этом случае целое число, к которому мы его применяем, является вводом myFunc(x)
, поэтому мы можем переписать { x => myFunc(x) }(myFunc(x))
как myFunc(myFunc(x))
. Теперь у нас есть
{ x => { x => myFunc(myFunc(x)) }(myFunc(x)) }
Мы можем применить ту же логику, которая использовалась на предыдущем шаге, чтобы разбить термин { x => myFunc(myFunc(x)) }(myFunc(x))
. Мы бы получили myFunc(myFunc(myFunc(x)))
. Если вы продолжите эту логику, вы увидите, что repeater
будет составлять myFunc
. Для каждого n
будет добавлен еще один слой myFunc
. Результат будет выглядеть так, если n = 3
{ x => myFunc(myFunc(myFunc((x))) }
Таким образом, для repeater(addOne, 3)
мы бы получили
{ x => addOne(addOne(addOne(x))) }
А repeater(addOne, 5)
составляет
{ x => addOne(addOne(addOne(addOne(addOne(x))))) }
Все, что repeater
делает, просто создает эту функцию и возвращает ее пользователю. Вы можете взять эту функцию возврата repeater
и вставить val
с именем f
val f = { x => addOne(addOne(addOne(x))) } //ie repeater(addOne, 3)
f
принимает целочисленный ввод и возвращает это целое число плюс 3. Затем мы можем получить фактический результат, который мы хотим, используя это
val someIntegerPlus3: Int = f(someInteger)