【发布时间】:2016-05-09 13:00:33
【问题描述】:
我在 scheme 中构建了一个递归函数,它将在某个输入上重复给定函数 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,无论它堆叠多少组合,它都会执行。
【问题讨论】:
-
为什么会“推迟一堆操作直到 n = 0”?在
count = 0,您只返回total,这可能是最简单的工作,几乎没有任何成本。 -
对,但我想我的意思是,当您返回总计时,它会返回像
(compose square (compose square (compose square (identity x))))这样的操作堆栈,它会在返回总计时进行评估,而不是在尾调用发生时.还是我这样想太多了? -
@EddieV 函数的所有参数都在调用函数之前进行评估。
-
我明白了。好吧,我想那是有道理的,谢谢!
-
虽然它是迭代的,但你最终返回的是一个大而粗糙的 lambdas 巢。下面 Noamik 的回答为您提供了一种不搞乱的方法。
标签: recursion scheme iteration racket tail-recursion