倍增功能

时间:2013-02-07 03:10:15

标签: scheme racket

使用

(define (double fn) (lambda (x) (fn (fn x))))

你能解释一下吗

((((double double) double) 1+) 0)

等于16?如何使用替换?

2 个答案:

答案 0 :(得分:1)

double函数接受另一个函数(让我们调用该函数fn)作为它的参数,然后返回一个接受一个任意参数的函数。它将该参数传递给fn,然后将 的结果传递给fn,这就是结果。

例如:

> ((double add1) 1)
3

它在1上调用add1,返回2,然后在2上调用add1,它会给出结果,3。

在您的示例中,我们将double传递给它自己,所以现在我们有一个程序,当给出1+时,我们会给它添加4(因为我们有两个double's ,每个double调用两个1+。但接着我们传递了新的另一个 double过程,这样我们就有八个double(两个double将调用两个1+我们已经创建了)。这八次调用1+中的每一次都是两次。

所以这个新程序将调用{{1}}两次,八次,你给它的任何参数,从而为你传递给它的任何参数增加16。

答案 1 :(得分:0)

  

如何使用替换?

如果您使用的是Racket,您可以在“使用lambda的中级学生”语言中使用DrRacket的步进工具来查看确切的替换步骤。