1

我正在学习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)))))

据我了解,这两个不是递归过程,但它们返回递归过程(大声笑)。那么这两者有什么区别呢?是否有可能在我给 X 赋值之前第一个返回已经计算过的过程?我很困惑......请帮忙。

4

2 回答 2

2

事实上,这两个过程都是递归的,每个过程都在执行过程中的某个时刻调用自己。此外,两者都lambda在某个时候返回 a - 意思是:它们是返回过程的过程。

第一个过程总是返回 a lambda,而第二个过程短路并fn等于时返回,但对于大于的值1也返回 a 。所以它们没有什么不同,除了基本情况(equals )的处理方式。lambdan1n1

于 2013-04-03T14:05:41.953 回答
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))

于 2013-05-10T13:24:53.600 回答