Skip to main content

作业 1 | CS 61A 2024 春季学期

作业 1: 函数,控制

截止时间:1 月 25 日(周四)晚上 11:59

说明事项

下载 hw01.zip

提交方式: 完成后,请将您编辑的所有代码文件上传到 Gradescope 以提交作业。截止时间前可多次提交,最终提交版本将被评分。请检查您是否已在 Gradescope 上成功提交代码。有关提交作业的更多说明,请参见 Lab 0

关于 Ok 的使用: 如果您对使用 Ok 有任何疑问,请参阅 本指南

参考阅读: 以下是一些可能有用的参考资料:

评分: 作业根据正确性评分。每个不正确的问题将使总分减少一分。 本次作业满分为 2 分。

入门指导视频

这些视频可能会为解决此作业中的问题提供一些有用的指导。

观看视频前,请先登录您的 berkeley.edu 邮箱。

YouTube 链接

必做题目

Q1: A Plus Abs B

Python 的 operator 模块包含诸如 addsub 这样的双参数函数,它们对应 Python 内置的算术运算符。例如,add(2, 3) 的计算结果与表达式 2 + 3 相同,都等于 5。

请在以下函数中填空,实现将 a 加上 b 的绝对值的功能,但不能直接调用 abs 函数。除了两个填空位置,不允许修改任何其他代码。

def a_plus_abs_b(a, b):
"""返回 a + |b| 的值,禁止使用 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 = _____
else:
f = _____
return f(a, b)

使用 Ok 来测试你的代码:

python3 ok -q a_plus_abs_b

使用 Ok 来运行本地语法检查器 (它会检查你是否修改了提供的代码,除了两个空白处):

python3 ok -q a_plus_abs_b_syntax_check

Q2: 三选二

编写一个函数,接收三个正数作为参数,返回其中两个最小数的平方和。函数体只能用一行代码完成。

def two_of_three(i, j, k):
"""返回 m*m + n*n,其中 m 和 n 是 i、j 和 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 _____

提示: 考虑使用 maxmin 函数:

>>> max(1, 2, 3)
3
>>> min(-1, -2, -3)
-3

使用 Ok 来测试你的代码:

python3 ok -q two_of_three

使用 Ok 来运行本地语法检查器 (它会检查你是否只用了一行代码作为函数体):

python3 ok -q two_of_three_syntax_check

Q3: 最大因子

编写一个函数,接收一个大于 1 的整数 n,返回小于 n 且能被 n 整除的最大整数。

def largest_factor(n):
"""返回小于 n 的 n 的最大因子。

>>> largest_factor(15) # 因子是 1, 3, 5
5
>>> largest_factor(80) # 因子是 1, 2, 4, 5, 8, 10, 16, 20, 40
40
>>> largest_factor(13) # 因子只有 1,因为 13 是质数
1
"""
"*** YOUR CODE HERE ***"

提示: 要检查 b 是否能整除 a,可以使用表达式 a % b == 0,意思是“a 除以 b 的余数是 0”。

使用 Ok 来测试你的代码:

python3 ok -q largest_factor

Q4:冰雹序列

道格拉斯·霍夫斯塔德 (Douglas Hofstadter) 的普利策奖获奖作品《哥德尔、埃舍尔、巴赫》中提出了以下数学难题。

  1. 选择一个正整数 n 作为起始值。
  2. 如果 n 是偶数,则将其除以 2。
  3. 如果 n 是奇数,则将其乘以 3 并加 1。
  4. 继续此过程,直到 n 为 1。

数字 n 会经历上下波动,但最终会变为 1 (至少对于所有已尝试的数字是这样——虽然尚未有人证明这个序列一定会终止)。 这就像冰雹在大气中上下翻滚,最终落回地面一样。

n 的这个值序列通常称为冰雹序列。 编写一个函数,该函数接收参数 n,打印出从 n 开始的冰雹序列,并返回序列的步数:

def hailstone(n):
"""打印从 n 开始的冰雹序列并返回其
长度。

>>> a = hailstone(10)
10
5
16
8
4
2
1
>>> a
7
>>> b = hailstone(1)
1
>>> b
1
"""
"*** YOUR CODE HERE ***"

冰雹序列可能会很长! 尝试 27。你能找到最长的序列是什么?

请注意,如果最初 n == 1,则序列的长度为一步。 提示: 如果你看到 4.0 但只想要 4,请尝试使用整数除法 // 而不是常规除法 /

使用 Ok 来测试你的代码:

python3 ok -q hailstone

想了解更多关于冰雹或冰雹序列的信息吗?请参考以下文章:

  • 查看这篇文章,了解更多关于冰雹如何形成的信息!
  • 2019 年,在理解冰雹猜想如何适用于大多数数字方面取得了重大进展

在本地查看你的分数

你可以通过运行以下命令在本地查看你在本次作业中每个题目的得分情况

python3 ok --score

这不会提交作业! 当你对得分满意后,请将作业提交到 Gradescope 以获取学分。

提交

通过将你编辑过的任何文件上传到相应的 Gradescope 作业来提交此作业。实验 0 包含详细说明。 另外,所有不在大型实验课(mega lab)的学生都必须填写此考勤表。无论您是否参加实验课,或因故缺席,请每周都提交此表格。大型实验课的学生不需要填写考勤表。

如果您正确完成了所有问题,您应该在 Gradescope 的自动评分器输出中看到您的分数是 6.0。每个作业满分为2分,所以如果全部正确,您将获得满分2分。请记住,每个错误的问题会扣 1 分,因此,如果在此作业中获得 5.0/6.0,最终作业成绩将是 1.0/2.0。