1 杂谈
很高兴我有了104名粉丝,感谢你们一直关注我一个初学者的学习之路,希望日后我们可以共同进步。接下来我会对我的更新的内容做一些调整:
- 删除“数学基础”专栏,一些算法背后的数学原理与基础我会在文章中单独安排出一章;
- 新增“科研绘图”专栏,目的是为了提高我对Visio、PPT等绘图工具的使用,以及科研绘图的审美。源文件我会放在自己的Github仓库;
- 开始更新Deep Learning的内容,学习的材料为沐神(李沐,BosonAI联合创始人,曾担任亚马逊首席科学家。)的《动手学深度学习》(课程安排 - 动手学深度学习课程 (d2l.ai))。
今天我给大家带来的是一个关于斐波那契数列的编程问题。
2 问题描述
2.1 文字描述
编写一个程序,输出前n个斐波那契数列的数字。斐波那契数列是一个数列,其中每个数字都是前两个数字的和,起始的两个数字为0和 1用户输入一个正整数n,程序应输出前n个斐波那契数列的数字,以空格分隔。
2.2 斐波那契数列的数学描述
2.2.1 基础条件
- F ( 0 ) = F 0 F(0)=F_0 F(0)=F0
- F ( 1 ) = F 1 F(1)=F_1 F(1)=F1
2.2.2 递归定义
对于
n
≥
2
n≥2
n≥2,斐波那契数列中的第n项
F
(
n
)
F(n)
F(n) 由以下公式递归定义:
F
(
n
)
=
F
(
n
−
1
)
+
F
(
n
−
2
)
F(n)=F(n-1)+F(n-2)
F(n)=F(n−1)+F(n−2)
3 问题分析
解决这个问题,我们需要关注几个事项:
- 键入数字n的范围:应该满足 n ≥ 2 n≥2 n≥2(数学意义上);
- 输出的数列元素以空格分隔;
- 同样也要处理数据类型异常的情形,保证代码的稳健。
4 代码实现
try:
n = int(input("请输入一个正整数:")) # 用户键入数字
if n < 1:
raise ValueError("请输入一个大于等于1的数字")
f = [0, 1] # 初始化储存斐波那契数列的列表
for i in range(2, n): # 以循环结构的方式添加斐波那契数字
f.append(f[i-1] + f[i-2])
print(" ".join(map(str, f[:n]))) # 打印前n个斐波那契数列
except ValueError as e: # 处理非正整数输入的异常情形
print(e)
5 补充知识
让我们看看以下语句:
print(" ".join(map(str, f[:n]))) # 打印前n个斐波那契数列
解析一下这个语句:
5.1 f[:n]
-列表切片
-
f
是一个列表,包含了斐波那契数列的元素; -
f[:n]
是列表的切片操作,表示从列表f
中取出前n
个元素。
例如,如果 f = [0, 1, 1, 2, 3, 5]
且 n = 4
,则 f[:n]
会返回 [0, 1, 1, 2]
。
5.2 map(str,f[:n])
-映射函数
-
map()
是一个 Python 内置函数,用来将一个函数应用到一个可迭代对象的每个元素上; -
str
是 Python 的一个内置函数,作用是将输入转换为字符串; -
map(str, f[:n])
的作用是将f[:n]
列表中的每个元素都转换为字符串。
如果 f[:n]
返回 [0, 1, 1, 2]
,那么 map(str, f[:n])
的结果将是 ['0', '1', '1', '2']
。
5.3 " ".join()
-字符串连接
-
" ".join(...)
是 Python 字符串的join
方法,用于将一个可迭代对象中的所有字符串连接成一个新的字符串; -
" "
是连接符号,在这里是一个空格,意味着在连接时每两个元素之间用一个空格分隔; -
当
map(str, f[:n])
返回['0', '1', '1', '2']
时," ".join(...)
会将它们连接成一个字符串"0 1 1 2"
。