尾递归过程的递归过程

时间:2015-10-08 09:35:59

标签: recursion scheme racket tail-recursion

我正在尝试用我已构建的另一个过程构造一个尾递归过程。但我并不完全清楚我应该如何思考。我举两个例子,第一个是我的程序,它不是尾递归的,第二个是我的"尝试"做一个尾递归程序。是的...尝试:)我会很高兴有关如何构建尾递归程序的任何建议,我应该如何开始,思考和任何。

编辑:第一个完全符合我的要求。 (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)))

1 个答案:

答案 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)