[CS61A] Lecture 1&2&3. Introduction&Functions&Control

[CS61A] Lecture 1&2&3. Introduction&Functions&Control

前言

CS61A是加州大学伯克利分校一门计算机专业课程,用于指导大一新生入门计算机科学这一门学科,这门课程以《计算机程序的构造与解释》(Structure and Interpretation of Computer Programs,SICP)这一计算机领域经典书籍为教纲,由浅入深详细地介绍了计算机程序的本质,并系统性地说明该如何编写一个健壮且易于维护的程序。不过,SCIP一书以Lisp的方言Scheme作为教学编程语言,由于Scheme过于小众化,CS61A以现今更为更为流行的Python作为教学编程语言,部分教纲略有变更。

CS61A包含了近四十节课,课程内容涵盖了编程语言的方方面面,每节课包含了lecture、discussion、lab、office hours、tutoring、textbook几部分,此外还包含了多个用来练手的homework和project。虽然CS61A是大一新生的计算机入门课程,已在计算机领域工作多年的职员依然可以学习这门课程,并从中学习到相当可观的知识。实际上,最初的SICP公开课的面相对象本就是惠普公司的员工。接下来,我将不定时总结观看CS61A网课视频中所获取的知识,并写在随笔中,以此温故而知新。

Lecture

Lecture 1. Introduction

CS61A的第一节课主要是做了些基本的介绍:

  • 三名课程讲师:Richard Roggenkemper、Laryn Qi、Cooper Bedin
  • 计算机科学的基本概念:计算什么问题?如何解决问题?现实中的应用?
  • CS61A介绍:一门用来控制编程复杂度(掌握抽象与编程范式)的课程

Lecture 2. Functions

CS61A第二节课的主题是函数(Functions),本节课首先从数学中的表达式(函数、平方、根号、加号、除号。。。)作为切入点,介绍了编程语言的基本概念:表达式,说明了表达式的结构、执行、复杂表达式的执行顺序等等。

其次介绍了赋值语句,赋值语句的本质是绑定,将一个值用一个符号绑定起来,随后便可以使用该符号表示对应的值。

接着介绍了函数,函数用来定义一段过程,其包含了一个或多个表达式,在定义一个函数后,便可以通过表达式执行它。

最后,讲师介绍了作用域的概念,每一个变量都拥有它的作用域,要么在全局作用域中,要么在函数或其他自定义的作用域中。解释器在搜索变量所绑定的值时,首先会搜索当前作用域,若搜索不到则会在上层作用域中搜索,直至全局作用域。

Q&A:作用域是什么?

Lecture 3. Control

CS61A第三节课的主题是流程控制(Control),大体包括如下内容:

  • print和None:介绍了在Python中print函数以及None的用法。
  • 纯函数与非纯函数:纯函数指除不对其他作用域作任何更改的函数,不为纯函数的函数则为非纯函数。这里的更改指外部变量的更改以及外部环境的变化等,例如:在函数中修改了一个外部变量a的值、print打印字符串等。
  • 函数的生命周期:函数定义和执行的过程。
  • 流程控制:if、elif、else、while
  • 课堂练习:输入一个正整数,找出该数因式分解得出的最长序列。例如:输入12,输出2、2、3;输入858,输出2、3、11、13。

Q&A:纯函数的理解?

Homework

CS61A的第一份作业:https://cs61a.org/hw/hw01/ ,Variables and Functions, Control,其中包含了四道题目。

Q1: A Plus Abs B

题目:输入两个自然数a和b,要求输出a与b的绝对值的和,即a+abs(b),注意不能使用内置库。

代码:

from operator import add, sub

def a_plus_abs_b(a, b):
    """Return a+abs(b), but without calling abs.

    >>> a_plus_abs_b(2, 3)
    5
    >>> a_plus_abs_b(2, -3)
    5
    >>> a_plus_abs_b(-1, 4)
    3
    >>> a_plus_abs_b(-1, -4)
    3
    """
    if b < 0:
        f = sub
    else:
        f = add
    return f(a, b)

Q2: Two of Three

题目:输入三个正数i、j、k,输出其中较小的两个数的平方和,注意函数体只允许一行代码。

代码:

def two_of_three(i, j, k):
    """Return m*m + n*n, where m and n are the two smallest members of the
    positive numbers i, j, and k.

    >>> two_of_three(1, 2, 3)
    5
    >>> two_of_three(5, 3, 1)
    10
    >>> two_of_three(10, 2, 8)
    68
    >>> two_of_three(5, 5, 5)
    50
    """
    return i*i+j*j+k*k-max(i, j, k)*max(i, j, k)

Q3: Largest Factor

题目:输入一个正整数n,要求输出比n小且能被n整除的最大的数。

代码:

def largest_factor(n):
    """Return the largest factor of n that is smaller than n.

    >>> largest_factor(15) # factors are 1, 3, 5
    5
    >>> largest_factor(80) # factors are 1, 2, 4, 5, 8, 10, 16, 20, 40
    40
    >>> largest_factor(13) # factor is 1 since 13 is prime
    1
    """
    "*** YOUR CODE HERE ***"
    res = n//2
    while n % res != 0:
        res -= 1
    return res

Q4: Hailstone

题目:输入一个正整数n,给定如下计算过程:如果n是偶数,那么将n除以2;如果n是奇数,那么将n乘3并加1;如此往复直至n为1。现要求每次执行该计算过程时都将n的值打印在屏幕上,且返回计算的次数。

代码:

def hailstone(n):
    """Print the hailstone sequence starting at n and return its
    length.

    >>> a = hailstone(10)
    10
    5
    16
    8
    4
    2
    1
    >>> a
    7
    >>> b = hailstone(1)
    1
    >>> b
    1
    """
    "*** YOUR CODE HERE ***"
    print(n)
    if n == 1:
        return 1
    return 1+hailstone(n//2 if n % 2 == 0 else n*3+1)

参考资料

2020年秋CS61A网课视频:https://www.bilibili.com/video/BV1s3411G7yM

SICP公开课:https://www.bilibili.com/video/BV1Xx41117tr

CS61A官网:https://cs61a.org/

CS61A指导资料(来自于伯克利的一名学生):https://cs61a.vanshaj.dev/

posted @ 2022-07-24 16:20  frankming  阅读(511)  评论(0编辑  收藏  举报