首页 > 代码库 > SICP中丘奇计数的理解

SICP中丘奇计数的理解

数字有意义吗?如果有意义他的意义是什么?
从原始时期的时候人们就开始对数有了认识.
放羊的表示我养的一只羊可以代表数字1
烙饼的表示我做的一张饼可以代表数字1
计算机科学家表示我写的函数被调用一次可以表示数字1
我们就用这个概念来表示一下数字.来体会一下万物皆是函数的概念.
首先规定参数可以是任意类型
我们首先对0这个数字进行定义
(define  (zero f) (lambda (x) x))

参数 f 是函数,但他没有被调用.这就是我们的0的概念他返回的匿名函数用来表示已经为0

我们首先应该确定被调用函数的格式

(define (f x) (display "x"))

每次这个函数被调用,都会打印出"x".

之后我们可以来表示1

(define (one f) (lambda(x) (f x)))

可以看到f被调用了一次, x作为f的参数.

我们来表示2

(define (two f) (lambda(x) (f (f x))))

((two f) 0)来执行

函数返回了一个lambda表达式(lambda(x) (f (f x)))

他接受一个参数.然后再去调用函数

我们给他一个0.其实给他别的东西也可以.

之后函数变成(f (f 0))

函数f接受到了一个参数.但这个参数也是个函数

因此外面的f并没有被执行.参数里面的函数接受到了一个0不是函数.

因此可以执行 (display "x")

之后外面的函数被执行(display "x")

可知display被调用两次.我们的2的概念被表示出来了

效果就是屏幕上显示了两个x

也可以表示为

(define (two f) (lambda(x) (f ((one f)x))))

就是先执行one 之后在执行一次f .1+1也就是2的概念了

由此我们可以来表示加法的概念

(define (add num1 num2) (lambda(f) (lambda(x) ((num1 f) ((num2 f) x)))))

我们可以利用上面的one two结合加法来表示three(3)

(define three (add one two))

等价于

(define (three f) (lambda(x) ((one f)((two f) x)))))

首先(one f)会返回一个(lambda(x)(f x))然后((num2 f) x)作为参数传入

因为参数是个函数首先被计算((num2 f) x)结果就是输出两个x

然后执行(f x)输出一个 x

乘法就可以表示为

(define (mul num1 num2) (lambda(f) (lambda(x) ((num1 (num2 f))x))))

num2 f进行num1次调用 不就是我们的乘法的概念吗?

SICP中丘奇计数的理解