TGViewer
Android under the hood Android under the hood @android_under_the_hood · 1.53K subscribers
Post #90 3.56K
Рекурсия на основе корутин.

Возьмем к примеру алгоритм факториала, его можно написать как рекурсивно так и с помощью циклов. В случае с рекурсией могут быть проблемы с переполнением стэка вызовов (StackOverflowError), а вариант с циклом плох тем что не всегда дает преимущество в простоте написания кода.

У корутин есть классное решение, объединяющее преимущества обеих подходов:

// я опустил generic типы для лаконичности
val factorial = DeepRecursiveFunction { num ->
if (num == 0) 1
else num * callRecursive(num - 1)
}
println(factorial.invoke(10))


При вызове DeepRecursiveFunction.invoke() под капотом создается DeepRecursiveScopeImpl, где запускается бесконечный цикл:

class DeepRecursiveScopeImpl<T, R>(
// это тело DeepRecursiveFunction
block: suspend DeepRecursiveScope<T, R>.(T) -> R
) : Continuation<R> {

private var cont = this

suspend fun callRecursive(value: T): R {
// тут сохраняется Continuation для текущего вызова рекурсии, каждый последующий Continuation ссылается на предыдущий
}

override fun resumeWith(...) {
// когда рекурсия доходит до базового случая, результат передается с самого последнего Continuation объекта до самого первого, которым является сам класс DeepRecursiveScopeImpl, в итоге ссылка на Continuation зануляется, а бесконечный цикл возвращает конечный результат
}

fun runCallLoop(): R {
while (true) {
// при каждом шаге цикла создается Continuation для каждого вызова рекурсии, это происходит до тех пор пока block не вернет базовый случай
}
}

}


В отличии от привычной нам рекурсии, где каждый шаг хранился в стэке, здесь он хранится в Continuation объекте, то есть вместо стэковой памяти используется heap память.

P.S. Буду благодарен если пройдете опрос и напомимаю о втором своем канале, где пишу обо всем.

Всех с наступающим Новым годом!
  • 👏 27
  • 👍 3
  • 🥰 2
  • 🔥 1
More from @android_under_the_hood
  1. Oct 4, 2026Всем привет, хочу поделиться проектом, который запустил 1 октября — ЗдесьЯ. Это цифровая с…
  2. Oct 2, 2026Kotlin lambdas, часть I. До версии Kotlin 2.0 лямбды компилировались в анонимные классы, р…
  3. Sep 27, 2026Делегат свойства в Kotlin. В Kotlin есть конструкция, которой нет в JVM: var name by NameD…
  4. Sep 23, 2026val vs var под капотом. На уровне Kotlin все просто: val x = 10 var y = 20 y = 30 // компи…
  5. Sep 20, 2026Возвращение Прошло уже полгода с последней записи на канале. За это время в моей жизни про…
  6. Feb 5, 2026Пару фактов о Go, часть II. 4) Вместо Kotlin Nullability указатели как в С/C++, то есть об…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →