2013-04-03 67 views
1

我正在学习Scheme语言(我自己)。最近我遇到了这个问题: 有两个函数计算相同的值(组合函数f - n次)。Sceme递归的类型

(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

两者都只是更高阶的函数(因为它们返回一个函数)。从概念上说,他们试图代表的是 – Ankur

+0

谢谢。然而,奥斯卡洛佩斯确实指出了两者之间的一些细微差别。 – Aladin

回答

2

事实上,两个程序都是递归,每个程序在执行期间的某个时刻都会调用它自己。另外,两者都在某个时候返回lambda--这意味着:它们是返回过程的过程。

第一个程序总是返回lambda,而第二步骤的短路,并返回fn等于1,也为比1更大的n值返回lambda。所以他们没有什么不同,除了处理基本情况(n等于1)的方式。

+0

谢谢。 '(n等于1)'的解释(第二程序)对我有很大的帮助。 – Aladin

0

哇,比我的简单得多,虽然我是尾递归的并且适用于(重复fn 0)asuuming,在参数上运行函数零次就是这个参数。

(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))