我正在尝试用我已构建的另一个过程构造一个尾递归过程。但我并不完全清楚我应该如何思考。我举两个例子,第一个是我的程序,它不是尾递归的,第二个是我的"尝试"做一个尾递归程序。是的...尝试:)我会很高兴有关如何构建尾递归程序的任何建议,我应该如何开始,思考和任何。
编辑:第一个完全符合我的要求。 (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)))
答案 0 :(得分:2)
没有必要跟踪长度,索引等,因为我们可以编写一个直接在输入列表上迭代的尾递归解决方案,累积结果和(只是为了保持顺序)反转结果最后。
例如,使用符号进行列表操作,这是一个可能的解决方案的样子 - 并注意我们如何使用累积结果的初始值调用循环辅助程序,然后我们reverse
输出:
(define do-to-each-tail
(lambda (proc lst)
(define loop
(lambda (lst result)
(if (list-empty? lst)
result
(loop (list-rest lst)
(list-insert (proc (list-first lst)) result)))))
(reverse (loop lst (list-create)))))
按预期工作:
(do-to-each-tail square '(1 2 3))
=> '(1 4 9)