讨论 1:函数、控制流

出勤

你的助教会在讨论期间过来签到。

如果你因正当理由(如生病或时间冲突)错过了讨论课,请在一周内发邮件至 cs61a@berkeley.edu 以获得出勤分。

While 和 If

学习使用 ifwhile 是一项基本技能。在本次讨论中, 请专注于我们在前三节课中学习的内容:ifwhile、 赋值(=)、比较(<>==)和算术运算。请不要 使用我们课堂上尚未讨论过的 Python 功能,如 forrange 和列表。我们将在课程后续有充足的时间来学习这些内容, 现在正是练习使用 if(教材章节 1.5.4) 和 while(教材章节 1.5.5)的时候。

问题求解

实现函数的一个有用方法是:

  1. 选择一个示例输入和对应的输出。
  2. 用简单的步骤描述一个过程(用自然语言),从输入计算出输出。
  3. 确定你需要哪些额外的名称来执行这个过程。
  4. 使用这些额外的名称用代码实现这个过程。
  5. 确定你的实现是否真的适用于你最初的示例。
  6. 确定你的实现是否真的适用于其他示例。(如果不适用,你可能需要修改第2步。)

重要的是,这种方法不是直接从阅读题目到编写代码。

例如,在下一页的 is_prime 问题中,你可以:

  1. 选择 n 为 9 作为输入,False 作为输出。
  2. 过程如下:检查 9n)不能被 1 到 9n)之间的任何整数整除。
  3. 引入 i 来表示 1 到 9(n)之间的每个数字。
  4. 实现 is_prime(这部分由你和你的小组来完成)。
  5. 通过思考代码的执行过程来检查 is_prime(9) 是否会返回 False
  6. 检查 is_prime(3) 是否会返回 Trueis_prime(1) 是否会返回 False

Q1:是否为素数?

编写一个函数,当正整数 n 是素数时返回 True, 否则返回 False

素数 n 是一个不能被 1 和 n 以外的任何数整除的数。例如,13 是素数, 因为它只能被 1 和 13 整除,但 14 不是素数,因为它可以被 1、2、7 和 14 整除。

使用 % 运算符:x % y 返回 x 除以 y 的余数。

Q2:Fizzbuzz

实现经典的 Fizz Buzz 序列fizzbuzz 函数 接受一个正整数 n,并对从 1 到 n 的每个整数 打印一行输出。对于每个 i

  • 如果 i 同时被 3 和 5 整除,打印 fizzbuzz
  • 如果 i 被 3 整除(但不被 5 整除),打印 fizz
  • 如果 i 被 5 整除(但不被 3 整除),打印 buzz
  • 否则,打印数字 i

尽量使你的 fizzbuzz 实现简洁。

Q3:有序数字

实现函数 ordered_digits,它接受一个 正整数作为输入,如果其数字从左到右 是非递减顺序的,则返回 True,否则返回 False。例如, 5、11、127、1357 的数字是有序的,但 21 或 1375 的数字不是。

Q4:不同数字

编写一个函数,返回一个正整数中不同数字的个数。

提示:你可以使用 //% 将一个正整数分离为 其个位数字和其余数字。

你可能会发现先定义一个函数 has_digit(n, k) 会很有帮助,该函数判断数字 n 是否包含数字 k

Q5:重复

定义:正整数 n 是正整数 m重复序列,如果 n 是由 m 的数字重复一次或多次组成的。例如,616161 是 61 的重复序列,但 61616 不是。

实现 repeating,它接受正整数 tn。它返回 n 是否是某个 t 位整数的重复序列。

实现此函数所需的迭代过程是检查 rest 的最后 t 位是否与 n 的最后 t 位匹配,然后移除 rest 的最后 t 位。