我在方案中构建了一个递归函数,它会在某些输入上重复给定的函数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,然而它执行了很多组合它的堆叠。
答案 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