欢迎光临
我们一直在努力

Exercise 1 — Fun with Numbers 学习笔记

你需要掌握的核心能力

  • 循环:for … in range(…)

  • 容器:list / set

  • 列表操作:索引、append

  • 逻辑控制:布尔变量(flag)、break

  • 常用库:random、statistics

  • 格式化输出:"%.6f" % x


Task 1:Fibonacci 数列(前 N 项)

题目

递推:

xn=xn−1+xn−2,x0=x1=1x_n = x_{n-1} + x_{n-2},\\quad x_0=x_1=1xn​=xn−1​+xn−2​,x0​=x1​=1

求前 N=20 项。

Solution 代码核心

N = 20
fib = [1, 1]
for i in range(2, N):
fib.append(fib[i-1] + fib[i-2])
print(fib)

你要会的点

  • fib = [1,1]:先把初始条件放进 list

  • range(2, N):从第 2 项开始算到第 N-1 项(Python 的上界不包含)

  • fib[i-1]、fib[i-2]:用索引拿到前两项

  • append(…):把新值加到 list 末尾

延伸/更优写法

1)用两个变量滚动更新(省内存,适合只要最后一项)

a, b = 1, 1
for _ in range(N-2):
  a, b = b, a+b

2)生成器(generator)思路:边算边吐出
适合后面学迭代器时用。


Task 2:求 1000 以内所有素数(prime numbers)

Solution 代码核心

N = 1000
prime = [2]
for i in range(3, N):
isprime = True
for k in prime:
if k * k > i:
break
if i % k == 0:
isprime = False
break
if isprime:
prime.append(i)
print(prime)

你要会的点

  • prime=[2]:先存已知的第一个素数

  • 双层循环:

    • 外层 i:每个候选数

    • 内层 k in prime:用已有素数去试除

  • % 取余:i % k == 0 说明能整除 → 不是素数

  • isprime(flag 思维):默认 True,一旦发现能整除就改 False

  • break:提前退出内层循环(不浪费时间)

重要延伸:效率优化(你考试/作业常用)

优化 :埃拉托色尼筛法(Sieve of Eratosthenes)
这是“求一堆素数”的经典最快思路之一(后面数值方法/算法很常见)。


Task 3:随机数列表 + 统计量(min/max/mean/median/std)

Solution 代码核心

from random import seed, random
from statistics import mean, median, stdev

N = 101
array = [random() for _ in range(N)]

print("The minimum is: %.6f" % min(array))
print("The maximum is: %.6f" % max(array))
print("The mean is: %.6f" % mean(array))
print("The median is: %.6f" % median(array))
print("The stddev is: %.6f" % stdev(array))

你要会的点

  • random():生成 [0, 1) 的随机浮点数

  • 两种造 list 的方式:

    • 循环 append

    • 列表推导式(list comprehension):[random() for i in range(N)]

  • 统计函数:

    • min(array), max(array):内置函数

    • mean, median, stdev:来自 statistics

  • 输出格式:"%.6f" % x 保留 6 位小数

延伸:随机数的“可复现性”

你 import 了 seed 但没用上。
如果你希望每次运行得到一样的随机结果(实验可复现/写报告很重要):

seed(0) array = [random() for _ in range(N)]

细节补充(容易考/容易错)

  • statistics.stdev 默认是 样本标准差(分母 n-1),不是总体标准差。

  • N=101 是奇数,median 会更“干净”(正中间那一个)。


Task 4:找出 list 里所有重复出现的数字(返回“重复值集合”)

Solution 代码核心

from random import randrange

def find_duplicates(numbers):
seen = set()
duplicates = set()
for num in numbers:
if num in seen:
duplicates.add(num)
seen.add(num)
return duplicates

random_list = [randrange(9) for _ in range(15)]
print("Original list:", random_list)
print("Duplicates:", find_duplicates(random_list))

你要会的点

  • set():集合,特点是 不重复,查找 x in set 很快

  • 两个集合:

    • seen:已经见过的元素

    • dup:重复出现过的元素(最终答案)

  • 算法逻辑:

    • 如果当前元素在 seen 里 → 加入 dup

    • 无论如何都把当前元素加入 seen

写法改进(更 Pythonic)

直接遍历元素,不用下标:

def find_duplicates(numbers):

  seen, dup = set(), set()

  for x in numbers:

    if x in seen: dup.add(x) seen.add(x) return dup

题目理解补充

  • 返回的是 重复“值”的集合,不是重复出现的次数、也不是重复的索引。

  • randrange(9) 会生成 0~8(如果你想包含 9,应该用 randrange(10))。


这一整份练习的“考点总结”

  • range(a,b) 左闭右开;range(N) 最常用

  • list:索引、append、列表推导式

  • flag + break:写判断类算法(prime/搜索)非常常见

  • %:整除判断的核心工具

  • set:去重 + 快速 membership test(in)

  • 常用标准库:random、statistics

  • 格式化输出:%.6f 控制小数位,写报告很实用

  • 赞(0)
    未经允许不得转载:171主机测评 » Exercise 1 — Fun with Numbers 学习笔记
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址