作业 1:函数、控制 hw01.zip¶
下载 hw01.zip
MOLI:本次作业你将会学到什么
- Python的函数定义与调用、条件判断、循环控制
- Python的函数式编程思路:体会“把运算符当作对象”传递给另一个函数的思想
- 锻炼“用最精简的表达式完成任务”的能力,同时学习阅读并信赖内置库
- 测试与自动化检查:利用课程提供的
ok程序,熟悉“持续集成”理念,即写完就测,保持代码的正确性和整洁性 - 调试和输入输出:练习追踪程序运行过程、阅读打印输出帮助发现错误
必答题¶
Q1: A加B的绝对值¶
Python的operator模块包含两个参数的函数,例如add和sub,用于Python的内置算术运算符。例如,add(2,3)的计算结果是5,就像表达式2+3一样。
在下面的函数中填空,在不调用abs函数的情况下,将a加到b的绝对值上。除了两个空以外,你不能修改提供的任何代码。
def a_plus_abs_b(a, b):
"""返回 a+abs(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 --local
使用ok来运行本地语法检查器(它会检查你除了两个空格之外,没有修改提供的任何代码):
python3 ok -q a_plus_abs_b_syntax_check --local
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 _____
提示:考虑使用
max或min函数:
>>> max(1, 2, 3)
3
>>> min(-1, -2, -3)
-3
使用ok来测试你的代码:
python3 ok -q two_of_three --local
使用ok来运行本地语法检查器(它会检查你是否只使用了一行代码作为函数体):
python3 ok -q two_of_three_syntax_check --local
Q3: 最大因数¶
编写一个函数,该函数接受一个**大于 1** 的整数 n ,并返回小于 n 且能被 n 整除的最大整数。
def largest_factor(n):
"""返回小于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
"""
"*** 在这里填写你的代码 ***"
提示:要检查
b是否能整除a,可以使用表达式a % b == 0,该表达式可以理解为,“a除以b的余数为 0。”
使用ok来测试你的代码:
python3 ok -q largest_factor --local
Q4: 冰雹¶
道格拉斯·霍夫斯塔特(Douglas Hofstadter),在他获得普利策奖的书籍《哥德尔、埃舍尔、巴赫》(Gödel, Escher, Bach)中,提出了以下数学谜题:
- 选择一个正整数
n作为起始。 - 如果
n是偶数,将其除以2。 - 如果
n是奇数,将其乘以3并加1。 - 继续这个过程,直到
n为1。
数字 n 会计算的过程中上下波动,但最终会以1结束(至少对于所有已经尝试过的数字来说——因为没人证明过这个序列必定会终止)。类似于冰雹在大气中上下波动,而最终会落在地球上一样。
这个 n 的值序列常被称为冰雹序列(Hailstone Sequences)。写一个函数,它接受一个名为 n 的参数。该函数打印出从 n 开始的冰雹序列,并返回计算序列所执行的步数:
def hailstone(n):
"""从n开始打印冰雹序列,并返回序列长度。
>>> a = hailstone(10)
10
5
16
8
4
2
1
>>> a
7
>>> b = hailstone(1)
1
>>> b
1
"""
"*** 在这里填写你的代码 ***"
冰雹序列可能会非常长!试试 27。你能找到最长的序列是什么?
注意,如果
n == 1最初为空,则序列计算会执行一步。提示:如果你看到结果是4.0但只需要4,那么请尝试使用地板除(floor division)
//而不是普通除法/。
使用ok来测试你的代码:
python3 ok -q hailstone --local
对 hailstone 序列感到好奇?看看这篇文章:
- 2019 年,在hailstone 猜想中,对于理解大多数数字是如何工作的方面,有重大进展!
检查你的得分¶
运行得到本次作业中每个问题的分数。
python3 ok --score --local