Обратите внимание, что ни ваш код, ни код в другом ответе не являются хвостово-рекурсивными: в рекурсивном вызове, таком как (+ (f ...))
, f
не находится в хвостовой позиции. Чтобы сделать код хвостовым рекурсивным, необходимо, чтобы результат рекурсивного вызова был результатом общего вызова (поэтому в приведенном выше примере +
равно в хвостовой позиции). Для этого вам понадобится вспомогательная функция. Вот способ сделать это, который опирается только на локальный define
:
(define (popadd t P d)
(define (popadd-loop tau pop)
(if (zero? tau)
pop
(popadd-loop (- tau 1) (+ pop d))))
(popadd-loop t P))
Здесь, по сути, то же самое, используя named- let
, что лучше:
(define (popadd t P d)
(let popadd-loop ([tau t] [pop P])
(if (zero? tau)
pop
(popadd-loop (- tau 1) (+ pop d)))))
Наконец, обратите внимание, что эта проблема имеет решение в закрытой форме:
(define (popadd t P d)
(+ P (* t d)))
Я действительно желаю , чтобы люди, пытающиеся преподавать программирование, знали достаточно математики, чтобы не ставили задачи, которые имеют тривиальные ответы в замкнутой форме, поскольку это побуждает людей писать неэффективно (в код сложности). Очевидно, это не твоя вина: это твоя учительница.