admin管理员组

文章数量:1609965

第一章 通过函数建立抽象(Building Abstractions with Functions)

SICP主题是“抽象”,抽象的目的是为了控制复杂度,而控制复杂度的能力是优秀码农的极其重要的能力。也是计算机专业的元知识,是武林高手的内功

1. 本章的学习要点

1. 函数式编程 (https://zhuanlan.zhihu/p/42621241)

在命令式的编程范式当中,你通过告诉计算机一系列需要执行的任务并在计算机执行以后以完成你的目的。当执行任务的时候,状态可能会发生改变。比如,假设你原先将A赋值为5,然后你改变A的数值。你会有很多变量,并且变量内部的值也会发生改变。

从语法上说,函数式编程有如下特点:

  • 函数本身可以赋值给变量,赋值后变量为函数;
  • 允许将函数本身作为参数传入另一个函数;
  • 允许返回一个函数。

在一个函数式编程范式当中,你并不告诉计算机要干什么,而是告诉它是干什么的。什么是一个数字的最大公因子,什么是从1到N的乘积,等等。

说明1:变量不能变化。当时设置好了一个变量,它将永远保持那样的方式(注意下,在纯粹的函数式编程语言当中通常不称之为变量)。因此,在函数式编程范式当中,函数不会有副作用。函数的副作用是指函数修改了一些函数作用范围外的东西。让我来看一个典型python的例子:

a = 3
def som_func():
    global a
    a = 5
some_func()
print(a)

这段代码的输出是5.在函数式编程范式当中,改变变量的值是不容许的事情,同样影响在函数作用域之外的变量也是不被容许的。函数唯一可以做的事情是做一些计算然后以结果的形式返回。

说明2:在函数式编程当中,我们不使用循环。我们采用递归。递归是一个数学上的概念,通常,它意味着“自己调用自己”。在一个递归的函数当中,函数重复地以子函数的形式调用自己。这里有一个非常的python编写的递归函数的例子:

def factorial_recursive(n):
    # Base case: 1! = 1
    if n == 1:
        return 1

    # Recursive case: n! = n * (n-1)!
    else:
        return n * factorial_recursive(n-1)

说明3:Python的函数不但可以返回int、str、list、dict等数据类型,还可以返回函数!

为什么定义lazy_prod()函数和返回函数cal_prod()?

python支持返回函数的基本语法

只返回函数的作用:

返回函数可以把一些计算延迟执行。例如,如果定义一个普通的求和函数:

2. 本章的学习资料

1)https://cs61a/  按照calendar,完成第一周和第二周的学习要求,建议先看中文资料,然后阅读每一章的英文书,并完成对应的实验

2)Python的版本跟lisp(Secheme)版本的讲述有一定的改变,增加了一些题目,建议补充完成

3. Lab要求总结

Lab 0: 基本操作-通过命令行理解“解释程序”的概念

具体要求如下:https://cs61a/lab/lab00/

1. 安装环境

  • 安装terminal
  • 安装python 3
  • 安装text editor

2. 本次练习主要是熟悉python的解释器,并熟悉如何在python里实现表达式操作。

Lab 1:结构(条件,循环)与函数

一共6个实验,1个quiz。

Lab 2:Lambda表达式,高阶函数以及环境图联系

1. 基本相关语法练习,阅读

2. Lambda表达式再练习,代码编写(3,4,5)

3. 环境图练习 (2道)

Lab 3:递归

1. 递归练习(阅读):2道

2. 递归练习(代码编写)

  2.1 Pascal's Triangle

  2.2 Num eights

  2.3 Ping-pong

 

 

本文标签: 范式表达式函数学习笔记interpretation