我正在学习Scheme语言(由我自己)。最近我遇到了这个问题: 有两个函数可以计算相同的值(组合函数f - n次)。
(define (repeated f n)
(lambda (x)
(if (= n 1)
(f x)
(f ((repeated f (- n 1)) x)))))
(define (repeated f n)
(if (= n 1)
f
(lambda (x)
(f ((repeated f (- n 1)) x)))))
据我所知,这两个不是递归过程,但它们返回递归过程(lol)。那么这两者有什么区别?是否有可能第一个返回已经计算过程甚至在我给X赋值之前?我很困惑......请帮帮忙。
答案 0 :(得分:2)
实际上两个过程都是递归的,每个过程都在执行期间的某个时刻调用自身。此外,两者都在某个时刻返回lambda
- 意思是:它们是返回程序的程序。
第一个过程总是返回lambda
,而第二个过程短路并在f
等于n
时返回1
,但也返回lambda
} n
的值大于1
。所以他们没有什么不同,除了基本情况(n
等于1
)的处理方式。
答案 1 :(得分:0)
哇,这比我的简单得多,虽然我的尾部递归并适用于(重复fn 0),因为在参数上运行零次函数只是那个参数。
(define (repeated fn times)
(let loop (
(continuation (lambda (x) x))
(count-down times))
(if (not (> count-down 0))
(lambda (x) (continuation x))
(loop (lambda (x) (continuation (fn x))) (- count-down 1)))))
你们两个之间的区别在于第一个会立即返回一个过程,然后将自己称为过程的一部分。第二个程序只有在完全计算出该程序的内容后才会返回一个程序。
正确,因此第一个返回递归过程,而第二个使用递归返回非递归过程。我的工作更像第二个,但可以计算非常大的数值的重复,而上面的两个将超过最大递归深度。
((重复cdr 1000000)(iota 1000589))