本书简介

《计算机程序的构造与解释》这本书是MIT计算机科学学科的入门课程,

大部分学生在学这门课程前都没有接触过程序设计,也就是说这本书是针对编程新手写的。

虽然是入门课程,但起点比较高,看懂里面的知识需要比较扎实的数学功底,

最起码要有高中数学水平,如果高中数学没学好,看起来会比较吃力。

当然,这本书的目标不是教你去做数学分析,或者让你学会使用LISP,他的目标我理解如下

  • 学会使用编程的一些基本元素,以编程的方式思考问题
  • 学会如何使用抽象和创造抽象来解决复杂问题
  • 学会如何良好的组织代码来编写大型软件系统,控制其中的复杂性
  • 是识别出好的程序设计和差的程序设计

以数学来示范各种编程原理是因为数学问题比较普遍,好多概念大家都有所接触,

没有二义性,不需要把时间花在问题描述和需求分析上。以LISP来进行编程原理解

说是因为LISP语法非常简单,不需要把时间花在讲解语法上。

程序设计的基本要素

表达式

LISP可能不好安装,我们就用Javascript来练习第一章的示范吧,打开Chrome浏览器,

按F12打开开发人员工具,在Console标签里就可以写代码了。

如果你还不知道编程能干什么,Javascript是啥东西,没关系,

我们可以先来实现一些简单的数学计算,在Chrome的Console里输入如下代码

>128
128
>128 + 12
140
>128 / 16
8
>128 - 28
100
>50 * 2
100
>3 + 2 * 10
23
>2 * 10 * 3.14
62.800000000000004

上面代码的大于号不用输,表示输入提示符,可以看到输入一些数学式子后Console会自动打印出

这个式子的求值结果。暂时先不用管背后的原理是什么,你现在已经开始在编程了。

上面你输入的式子就叫做表达式,里面的数就是普通的数字,+,-,*,/这些叫操作符,

操作符可以操作数,他操作的是自己两边的数。

命名和环境

像上面的例子里2 * 10 * 3.14其实就是在计算一个半径为10的圆的周长,3.14就是圆周率π,

计算圆的周长的公式不是2πr吗?

如果我们要计算好多圆的周长,那么每次都要把3.14打出来吗?能不能给3.14起个名字呢?

能,肯定能。能给某些计算对象命名是所有编程语言里最重要的一个功能,如下。

>var pi = 3.14
undefined
>2 * pi * 10
62.800000000000004
>2 * pi * 5
31.400000000000002
>2 * pi * 8
50.24

上面的第一句var pi = 3.14就相当于给3.14起了个名字pi,后面计算周长的表达式都可以用pi来代替3.14。

这就是一个最简单的抽象手段,你不需要记住pi的值具体是多少,只需要记住pi就表示圆周率就行了。

这个思路很关键,以后写代码写多了,你会发现你写的代码越来越复杂,能够给你写的部分代码进行命名,

然后使用的时候不用关心复杂的细节,就可以控制住这种复杂性,写出复杂的大程序来。

组合式的求值

3 + 2 * 10这个式子,*会先把2和10进行乘法计算,得到20,然后+会把3和20进行相加,

得到23,整个过程和数学里的加减乘除运算规律是一样的。如果你想执行(3 + 2) * 10的结果,

也可以直接把这个式子在Console里输入,也能正确的执行。

你在写2 * pi * 10时,pi会自动替换成3.14,这说明Javascript解释器帮你存储了pi到3.14

的对应,这种存储我们叫环境,每个环境里都存储了一些名字和计算对象的对应关系。

环境是个普遍的概念,它为求值的过程提供了一种上下文,对于我们理解程序

的执行起着很重要的作用。

比如你要执行(3 + 2 + 5) * (2 * (1 + 2)),这个表达式的求值过程就稍微复杂点了。

总体来看呢,这个式子分成两个部分,一个是(3 + 2 + 5),一个是(2 * (1 + 2)),然后

这两个部分进行想乘。要想得到这两个部分的相乘呢,又要先得到这两个部分的结果,怎么得到呢?

我们发现这两个部分其实也是表达式,比如(2 * (1 + 2)),其实也有两部分组成,一个

2,一个是(1 + 2),这两个部分相乘。这样从外到里分析,肯定会分析出最简单的不

能再分的表达式,可以直接求出结果。

这个过程就叫做递归,先不用计较复杂的解释,就先理解复杂表达式的求值需要先对子表

达式进行求值,子表达式的求值需要对子表达式的子表达式求值,这个过程就叫递归

递归是个刚开始不太好理解的概念,但掌握后用它来理解很多问题就很轻松了,以后会经常

遇到,加深印象。需要提的就是递归要有几个注意的地方。

  1. 递归分成好多个步骤
  2. 每个步骤要把整个事情向前推进,每次推进都向最终点更近一步。
  3. 整个递归过程要有个最终点,否则整个过程就无法终止了。

比如复杂表达式的求值过程就分成多个步骤,每个步骤就是把复杂表达式拆成多个子表达式

,然后每次拆呢,肯定是拆的越来越小,把整个过程向终点推进一步,然后呢如果拆的不能

再拆了,比如1 + 2直接就能得到结果了,这就到最重点了。

以上说的这些规则,就叫做编程的语法,慢慢你会发现有的编程语言的语法特别多,需要记住的东西特别多,比如各种括号,特殊字符,关键字。

而有的编程语言的语法特别少,基本上不用记,一大屏代码看到的都差不多的格式。刚学编程的时候建议选择后面一种的编程语言,如Javascript, Python,尽量学习一些编程的本质,而不是各种语法。

[蛙蛙推荐]SICP第一章学习笔记-编程入门的更多相关文章

  1. Spring实战第一章学习笔记

    Spring实战第一章学习笔记 Java开发的简化 为了降低Java开发的复杂性,Spring采取了以下四种策略: 基于POJO的轻量级和最小侵入性编程: 通过依赖注入和面向接口实现松耦合: 基于切面 ...

  2. Day1 《机器学习》第一章学习笔记

    <机器学习>这本书算是很好的一本了解机器学习知识的一本入门书籍吧,是南京大学周志华老师所著的鸿篇大作,很早就听闻周老师大名了,算是国内机器学习领域少数的大牛了吧,刚好研究生做这个方向相关的 ...

  3. 《Django By Example》第一章 学习笔记

    首先看了下目录,在这章里 将会学到 安装Django并创建你的第一个项目 设计模型(models)并且生成模型(model)数据库迁移 给你的模型(models)创建一个管理站点 使用查询集(Quer ...

  4. 《Java基础教程》第一章学习笔记

    Java 是什么呀! 计算机语言总的来说分成机器语言,汇编语言,高级语言.其中Java一种高级计算机语言,它是一种可以编写跨平台应用软件,完全面向对象的程序设计语言. Java划分为三个技术平台,Ja ...

  5. 【Python自然语言处理】第一章学习笔记——搜索文本、计数统计和字符串链表

    这本书主要是基于Python和一个自然语言工具包(Natural Language Toolkit, NLTK)的开源库进行讲解 NLTK 介绍:NLTK是一个构建Python程序以处理人类语言数据的 ...

  6. <<学会提问>>第一章学习笔记

    中国应不应该现在取消死刑? 中医是不是伪科学? 读书无用论? 集体主义和团队精神? 欧洲难民危机,你是支持接收难民,还是反对? 欧洲白左是不是幼稚圣母,抑或是右派种族歧视,顽固保守? 如何看待&quo ...

  7. Scala第一章学习笔记

    面向对象编程是一种自顶向下的程序设计方法.用面向对象方法构造软件时,我们将代码以名词(对象)做切割,每个对象有某种形式的表示服(self/this).行为(方法).和状态(成员变量).识别出名词并且定 ...

  8. CSAPP:第一章学习笔记:斗之气1段

    一.信息就是位+上下文:系统中的所有信息(包括磁盘文件.内存中的程序.网络上传送的数据),都是由一串比特表示,根据上下文对这些比特表示进行翻译. 二.C程序编译过程 1.源码结构 // test.c ...

  9. 《Linux内核设计与实现》 第一二章学习笔记

    <Linux内核设计与实现> 第一二章学习笔记 第一章 Linux内核简介 1.1 Unix的历史 Unix的特点 Unix很简洁,所提供的系统调用都有很明确的设计目的. Unix中一切皆 ...

随机推荐

  1. VMware虚拟机CentOS7网络通信与无线上网

    实现主机和虚拟机网络通信 1.虚拟机设置 VMware界面最上面,选择[虚拟机]->[设置]:将网络连接改为"桥接模式",如下图所示: 2.CentOS7网络设置 自动获取I ...

  2. Microsoft Teams 集成 (协作, 沟通 和 行为)

    Microsoft Teams 集成 (协作, 沟通 和 行为) 概述 Microsoft Teams是在Office 365中以chat为中心的工作空间.软件开发团队可以快速获得在一个专门的团队协作 ...

  3. 扫码下单使用FAQ

    1.适用情景:扫码点餐支付宝支付报错 解决方案:1.检查主账号上口碑授权是否失效.(重新授权) 2.检查主账号上的PID是否绑定.(绑定PID) 注意:1.支付宝扫码进行的扫码下单支持直连支付宝和蚂蚁 ...

  4. AlexNet卷积神经网络【前向反馈】

    1.代码实现 # -*- coding: utf-8 -*- """ Created on Wed Nov 14 17:13:05 2018 @author: zhen ...

  5. CentOS 6.5 搭建 .NET 环境, Mono 5.16.0 + Jexus 5.8

    最近有这样一个打算,就是准备把以前的有一个.NET 网站部署在Linux 下面,正好试试 .NET 跨平台的功能,为后续研究 .netCore 方向准备. 搭建环境: CentOS 6.5 + Mon ...

  6. cp 拷贝

    cp -a = cp -pdr p (preserve 保持)  复制时保持文件原有的属性(preserve) 模式 所有权 时间戳 d 连接文件 no dereference 复制时拷备连接文件的属 ...

  7. 安全之路 —— 使用Windows全局钩子打造键盘记录器

    简介 键盘记录功能一直是木马等恶意软件窥探用户隐私的标配,那么这个功能是怎么实现的呢?在Ring3级下,微软就为我们内置了一个Hook窗口消息的API,也就是SetWindowsHookEx函数,这个 ...

  8. C语言的main函数到底该怎么写

    公众号[编程珠玑]:专注但不限于分享计算机编程基础,Linux,C语言,C++,Python,数据库等编程相关[原创]技术文章,号内包含大量经典电子书和视频学习资源.欢迎一起交流学习,一起修炼计算机“ ...

  9. nginx+keepalived高可用及双主模式

    高可用有2中方式. 1.Nginx+keepalived 主从配置 这种方案,使用一个vip地址,前端使用2台机器,一台做主,一台做备,但同时只有一台机器工作,另一台备份机器在主机器不出现故障的时候, ...

  10. jsp 或 php 等view之中使用javascript简单处理的使用技巧

    前端人员在jsp,php等后台mvc之的coding之时,前端人员常常需要一些少量的数据处理,直接使用js的方法无疑是开销最小的.使用的方法 使用在标签之中嵌套script标签,使用document. ...