Scheme尾递归/迭代

时间:2016-02-01 06:43:47

标签: recursion scheme iteration racket tail-recursion

我在方案中构建了一个递归函数,它会在某些输入上重复给定的函数f,n次。

(define (recursive-repeated f n)
  (cond ((zero? n) identity)
        ((= n 1) f)
        (else (compose f (recursive-repeated f (- n 1))))))

我需要使用尾递归来构建此函数的迭代版本,如果我正确理解尾递归,我认为我已经做得正确。

(define (iter-repeated f n)
  (define (iter count total)
    (if (= count 0)
        total
        (iter (- count 1) (compose f total))))
  (iter n identity))

我的问题是,这实际上是迭代的吗?我相信我已经使用尾递归正确构建了它,但它在技术上仍然推迟了一系列操作,直到count = 0,然而它执行了很多组合它的堆叠。

1 个答案:

答案 0 :(得分:3)

你提出了一个很好的问题。您从一个递归过程(recursive-repeated)建立了一个递归过程((f (f (f ...))))到一个构建相同递归过程的迭代过程(iter-repeated)。

你认为自己基本上做了同样的事情,因为最终的结果是一样的。您刚刚以两种不同的方式构建了相同的链。这是"后果"在您的实施中使用compose

考虑这种方法

(define (repeat n f)
  (λ (x)
    (define (iter n x)
      (if (zero? n)
          x
          (iter (- n 1) (f x))))
    (iter n x)))

这里,我们不是提前建立整个函数调用链,而是返回一个等待输入参数的lambda。当指定输入参数时,我们将以迭代的方式在lambda内循环n次。

让它看起来有用

(define (add1 x) (+ x 1))

;; apply add1 5 times to 3
(print ((repeat 5 add1) 3)) ;; → 8