Skip to content

作业 1:函数、控制 hw01.zip

下载 hw01.zip

MOLI:本次作业你将会学到什么

  • Python的函数定义与调用、条件判断、循环控制
  • Python的函数式编程思路:体会“把运算符当作对象”传递给另一个函数的思想
  • 锻炼“用最精简的表达式完成任务”的能力,同时学习阅读并信赖内置库
  • 测试与自动化检查:利用课程提供的ok程序,熟悉“持续集成”理念,即写完就测,保持代码的正确性和整洁性
  • 调试和输入输出:练习追踪程序运行过程、阅读打印输出帮助发现错误

必答题

Q1: A加B的绝对值

Python的operator模块包含两个参数的函数,例如addsub,用于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 _____

提示:考虑使用 maxmin 函数:

>>> 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)中,提出了以下数学谜题:

  1. 选择一个正整数 n 作为起始。
  2. 如果 n 是偶数,将其除以2。
  3. 如果 n 是奇数,将其乘以3并加1。
  4. 继续这个过程,直到 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