自古学习,先了解和接触,产生兴趣,进行练习和付出,收获反馈,提炼总结,输出。
适合哪些读者:
- 如果刚刚接触编程,那么这本书可能不适合你;
- 不管你现在主要使用的是那一门编程语言都不影响阅读。因为sicp的魔法,它介绍编程的时候是非语言绑定的,“我需要判断逻辑,需要谓词,然后介绍语言的对应实现”
- sicp中使用的编程语言是lisp,十分简单,完全不需要担心因为不熟悉语言而影响阅读
- 与市面上普通编程算法书的区别:这本书非是现在普遍的先带你过一遍语言基础语法然后介绍一些普通算法的流水线产品,这本书非常严肃地讨论、解析了很多编程中的核心抽象,直指本质。先有核心概念,其他所有都围绕它依次展开
为什么要读
反思自身:深入地理解编程,算法,数据结构这些概念,而不只是使用它们。
培养能力:理解原理,并能自己扩展,举一反三。
对学习的思考:理解为什么需要学习原理,如何形成思考原理的思维习惯,重视原理和本质的价值观。
这本书的定位:
学习这本书并非为了某种特定的技术,而是为了夯实基础,深入学习和理解数据结构,编程语言,算法。所以在学习过程中应该有耐心和毅力,逼迫自己去深入思考,而不是只掌握表面。有的时候不能过于功利,对于书中的一些数学知识应该采取包容的态度,认真对待不要敷衍,它们都是很好的学习材料。
主要内容
因为能力有限,这个部分又很难写,如有错漏请指出。
作为一个导引,我深知只说空话是不行的,必须有些干货才行,所以我总结第一章近50页的内容,请诸位读者品鉴。
基本概念的辨析
函数和过程之间的矛盾,不过是在描述一件事的特征和描述如何去做一件事的普遍性差异。换一种说法就是,说明性知识和行动性知识的差异。
本书清楚描述了数学函数和编程中的函数的区别,数学中的函数描述是什么,而编程的函数描述怎么做。这也是sicp将函数称为过程(本书中的术语,英文procedure)的原因,而非使用编程中惯用的function。这些关于概念的辨析也是sicp的特点之一
有趣的算法思维
费马小定理:如果n是一个素数,且a是一个小于n的整数,那么a的n次方模n等于a。假设我们大致知道n不是一个素数时,上述定理也成立的概率。那么我们就可以通过不断检查小于n的整数来确定n不是素数或者n是素数的概率,这样的算法称为费马检查。
从特征上看,费马检查和我们熟悉的算法都不一样。一般的算法都保证计算结果一定正确,而费马检查得到的结果则只有概率上的正确性。
我们能说的是,对于任何数n,如果执行这一检查的次数足够多,而且看到n通过了检查,那么就能使这一检查出错的概率减少到所需要的程度。
能够证明(或者可以想象)存在着这样的可以使出错的概率达到任意小的检查算法,小到什么程度,使出错概率小到计算机本身运行出错的概率。而且当使用常规算法的计算时间不能接受时概率检查却不受多大影响。
数学知识作为引导
sicp的在这一章会使用一些有趣的但又轻度的数学知识来作为计算对象。
你知道如何计算开根号吗,你知道牛顿迭代法吗。你知道函数不动点吗,而牛顿迭代法可以转换为求一个函数的不动点的问题,那么能不能做到将牛顿迭代法作为参数传递给不动点计算框架进行计算呢?由于牛顿迭代法和不动点问题可以转换,那么能否借助数学上对于不动点的深入研究,优化牛顿迭代法呢?
以抽象为基石
我觉得很有趣的一点是:明明我在阅读这本书之前根本不懂函数式编程(本书语言所采用的编程范式),但是在阅读时却完全没有违和感。其对于抽象概念的叙述自然而然,水到渠成,没有一点学术的臭味。这门书将极大地锻炼递归函数的编写能力,推荐跟着例子亲手写,否则容易看睡着。而对于递归的概念,本书更是进行了深入讨论。
结语
人无完人,书无完书。即使是sicp也有很多适合的读者。但也有很多想读但又读不下去的读者,你是不是其中之一呢,或者是难以接受函数式编程,或者是被“相对密集”的数学概念困扰,或者不知道怎么一步步,从浅到深地学习。那么我相信你需要一些辅助——提炼重点并进行针对性思考和练习,我所做的就是这个。
资源
本书英文版有免费资源:sicp英文版
视频教程:MIT视频教程,b站也有
关于中文版,国内有工业出版社的实体书,github上也有一些中文翻译版本。阅读此书使用英文版更好,但用中文版也没有多大缺点,反而更流畅,看自己的选择。
另外本书使用的语言lisp有很多实现的版本,推荐scheme或者racket,racket有一个专门的IDE叫DrRacket。
后续会一步步更新。