Песочница

Рекурсия без роста продолжения

Выражайте циклы через именованный let или взаимно рекурсивные процедуры с вызовами в документированных хвостовых позициях.

Кратко

LISPEX
(let loop ((xs (list 1 2 3 4)) (sum 0)) (if (null? xs) sum (loop (cdr xs) (+ sum (car xs)))))

Результат

OUTPUT
10

Рабочий порядок

  • Передавайте аккумуляторы параметрами вместо работы после возврата рекурсии.
  • Хвостовая позиция сохраняется в последних путях if, begin, and/or, cond, case, do, call-with-values и apply.
  • В тестах ограничивайте вход и отличайте глубину continuation от стоимости выполнения.

Границы

  • Хвостовая безопасность не завершает бесконечный цикл и не отменяет бюджеты ресурсов.