Scheme中的递归类型

时间:2013-04-03 08:46:52

标签: recursion scheme

我正在学习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赋值之前?我很困惑......请帮帮忙。

2 个答案:

答案 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))