lambda算子中的数

数学基础差加之受严重的功利主义思想的影响,我对数学一直是没有太大兴趣。不过最近一段时间在看《算法导论》和《SICP》,几周下来发现进度之慢,归结原因是大部分数学知识都被我遗弃了,然后看的时候不得不在案头放上离散数学、微积分、线性代数、统计学、运筹学等大学未弃之书作为速查手册,说能快起来那是在自我忽悠。
做程序不能不懂数学犹如绘画不能不懂素描,基本功扎实了才好发挥。但鉴于程序员与数学家还是有本质的不同,不但要保持思维跨度在1到pow(10,15)也就是15个数量级之间还要学习相应业务知识以及应对客户,有点爱好的还要研究下声乐,绘画。这种情况下大可不必去与数学较劲。所以开发人员在数学的学习上最好是贯彻‘广度优先’这一方针,将要应对的问题和与之对应的数学知识在头脑中建立一张dynamic lookup table即可,待到用的时候在去查阅相关资料。即便不知道具体公式,但若能在求最大公约数的时候立马想到欧老前辈,也就算基本合格了。但话说回来,像这种基础的还是记住的好,不然不好意思跟人家说I'm very professional!
废话一大堆,最近才看到SICP的第三章,前面有一些习题也没有来得及做,昨夜在回顾习题的时候碰上了exercise2.6,关于lambda算子中数的表示,这套形式系统中,酷就酷在可以全由lambda演算系统中的合法符号来表示数,通俗的说就是用没有一个数字的表达式来表达数字
SICP中的一个例子
看看数学中0(zero )是如何用lambda表达式来定义的:
[code](define zero (lambda(f)(lambda(z) z)))[/code]
对于Alonzo Church来说,看上面的代码好比看英语,但对于在数学之海的岸口张望的人来说,不太直观
那再看看one two three
[code](define one (lambda(f)(lambda(z)(f z))))
(define two (lambda(f)(lambda(z)(f (f z)))))
(define three (lambda(f)(lambda(z)(f (f (f z))))))[/code]
似曾相识?那看下面

int zero=0;
int one=zero+1;
int two=one+1;
int three=two+1;

通过这样一对比,很容易就可以得出一个Chruch数与自然数的转化式
[code]
;做个过度
(define f (lambda(x)(+ x 1)))
(display (f (f 0)));output 2
;转换式
(define (cn-to-n cn)
((cn (lambda(x)(+ x 1)))0))
[/code]
数的表达有了,接下来就是运算了,习题的要求是做了加法运算
[code]
(define (add x y)(+ x y))
[/code]
一个很典型的加法,但不适用于Chruch数
要支持Chruch数的运算,那至少要在运算式中将其表达出来吧。
从前面的定义来看,lambda(f)(lambda(z)..)是跑不了的,由于Chruch数本身即是嵌套的函数表达式,那只要我能将最后的结果组合成(f (f (f ..(f z)..)))这番模样就算大功告成了
这个时候再琢磨一下前面的Chruch数,然后换个写法
[code]
(define one (lambda(f)(lambda(z)(f ((zero f)z)))))
(define two (lambda(f)(lambda(z)(f ((one f)z)))))
(define three (lambda(f)(lambda(z)(f ((two f)z)))))
[/code]
在Chruch表达式里面(one f)就是one,(two f)就是two,从而推出(x f)=x,再考虑到函数的叠加,试着定义'5',
[code]
(define five (lambda(f)(lambda(z)((three f)((two f)z)))))
[/code]
然后从特殊到一般,得出加法运算式
[code]
(define (add x y)
(lambda(f)(lambda(z)((x f)((y f) z)))))
[/code]
习题是完成了,但凡是涉及到数学的问题都有让人去发散思维的魔力,加法都出来了,何不看看乘法,前面定义了五,现在试着定义下六
[code]
(define six (lambda(f)(lambda(z)((three (two f))z))))
;依葫芦画瓢得出乘法定义
(define (mul x y)
(lambda(f)(lambda(z)((x (y f))z))))
[/code]

解题过程中为求天时地利,坚持坐北朝南,并发扬一贯的连蒙带猜,猜中带推的作风,虽终得正解,但仍不能掩饰数学知识之贫乏,恶补在所难免。
展开阅读全文

没有更多推荐了,返回首页