Я пытаюсь построить процедуру хвостовой рекурсии из другой процедуры, которую я уже построил. Но я не совсем осознаю, как я должен думать. Я приведу вам два примера, где первый — моя процедура, не являющаяся хвостовой рекурсией, а второй — моя «попытка» сделать хвостовую рекурсивную процедуру. Ага... попытка :) Буду рад любым советам, как строить хвостовые рекурсивные процедуры, с чего начинать, думать и т.д.
Изменить: первый работает именно так, как я хочу. (define square (lambda (x) (* x x)))
(do-to-each square '(1 2 3))
должен возвести каждое число в квадрат, то есть составить список (1 4 9)
(define do-to-each
(lambda (proc lst)
(if (list-empty? lst)
(list-create)
(list-insert (proc (list-first lst)) (do-to-each proc (list-rest lst))))))
(define do-to-each-tail
(lambda (proc lst)
(define loop
(lambda (n result)
(if (= n 1)
(list result)
(if (eq? (length result) 1)
(car result)
(loop (- n 1) (cons (car result) (do-to-each-tail proc (cdr result))))))))
(loop (length lst) lst)))