Один из способов сделать это - просто вернуть список, чтобы иметь доступ к нему на более высоких уровнях рекурсии.
Другой способ - сохранить ваш список в переменной вне рекурсии. Другими словами, не хранятся в стеке. Поскольку для этого не рекомендуется использовать глобальную переменную, нам нужна локальная рекурсия.
Следующий код - глупый способ перевернуть список, но он иллюстрирует технику, о которой я говорю.
(define (letrecreverse lst)
(letrec ((retlist '())
(reverse (lambda (lst)
(if (null? lst)
'()
(begin
(set! retlist (cons (car lst) retlist))
(reverse (cdr lst)))))))
(reverse lst)
retlist))
(letrecreverse '(1 2 3 4))
;outputs '(4 3 2 1)
Можете ли вы принять эту технику для своих целей?