不再是Lisp(2009)

2021-03-01 05:50:08

那是1983年,当时我正在麻省理工学院上第一门真正的计算机课程。哈尔·阿伯森(Hal Abelson)和比尔·西伯特(Bill Siebert)是联合讲师。 Hal传达了一个坏消息:“如果您已经知道如何编程,那么您可能会处于不利地位,因为您将不得不学习一些不良习惯。”

精彩的。我知道如何编程(毕竟我知道Macro-11,Z80assembly和BASIC),我可以猜出是什么坏习惯,违反非可爱原则可能就是其中之一。 Nothingfun将是不允许的。 (我很少在讲课上做笔记。我姆图忙着发表内部评论。)啊!再没有了! Lisp是什么?好的,也许在哈佛大学做这样的事情,但这是麻省理工学院!他们不是在这里黑客计算机吗?我想知道自己是怎么做的。我抱有两个希望。首先,我在哈佛学到的少量Lisp知识使我比教室中的其他250名学生有了更好的开端。其次,我只需要完成几个计算机课程即可满足EECS要求的这一部分。我可以忍受一段时间的Lisp,踏上公司的路线,并且完全没有兴趣通过这个过程。哈尔(Hal)将原型Lisp程序放到了黑板上:他带领全班学习替代模型:(事实5)(* 5(事实4))(* 5(* 4(事实3)))(* 5(* 4( * 3(事实2))))(* 5(* 4(* 3(* 2(事实1)))))(* 5(* 4(* 3(* 2(* 1(事实0)))) )))(* 5(* 4(* 3(* 2(* 1 1)))))(* 5(* 4(* 3(* 2 1))))(* 5(* 4(* 3 2)))(* 5(* 4 6))(* 5 24)120

“这是一个递归过程。在递归的每一步中,我们将问题分解为较小的部分,分别解决每个部分,然后组合答案。在此示例中,对事实的每个递归调用均使用较小的数字。最终,我们得出事实1,即已知为1。现在我们可以开始乘法了。”

然后他说:“这不是很有效。”我认为这对于Lisp程序来说是很奇怪的事情。在哈佛,Lisp的明显低效率被低估了。教授在这里指出了这一点,并将对此做一些事情。 “看看问题的大小如何取决于X的值。当X为5时,必须跟踪五个未决的乘法。如果X为十,那么将有十个未决的乘法。计算机将不得不用尽资源来跟踪这些资源。

“我们要做的是跟踪到目前为止我们看到的数字的乘积。像这样:

(定义(事实x)(定义(it n累加)(如果(零(n?n)累加(it(-n 1)(* n累加)))))(it x 1))(事实5)(it 5 1 )(iter 4 5)(iter 3 20)(iter 2 60)(iter 1120)(iter 0120)120

“这是一个反复的过程。我们没有将问题分解为单独解决的部分,而是将问题转换为具有相同解决方案的简单问题。 (迭代5 1)的解与(迭代4 5)的解相同,与(迭代3 20)的解相同,依此类推。

Warning: Can only detect less than 5000 characters