用python实现Fibonacci数列
- 概述
- Fibonacci数列
- 前言bb
- 首先让我们看看源代码:
- (一)question
- (二)answer
- 最后
概述
Fibonacci数列
除第一个和第二个数外,任意一个数都可由前两个数相加得到:
1, 1, 2, 3, 5, 8, 13, 21, 34, …
前言bb
作为一个新接触python没多久的小白,学这章的时候刚好是廖雪峰老师要引入generator的概念,然后提出了一个过渡的函数打印的方式…
——然后我在这段代码上卡了两天(dbq了我的老师们),翻遍大量带有这段代码的资料,都没有看到任何解释或是注释,然后我还是楞想不明白。终于在朋友的指点下悟了!
我写这篇东西的初衷是希望能够帮助到同对此困惑的人
首先让我们看看源代码:
def fib(max): #question1
n, a, b = 0, 0, 1 #question2
while n < max:
print(b)
a, b = b, a + b #question3
n = n + 1
return 'done'
(一)question
首先这是定义了一个 fib()函数,通过循环赋值,得到Fibonacci数列
然后我有了以下困惑:
- question1:max是啥玩意,为什么我在整个代码块里都没看到哪有传入max这个值
- question2:n,a,b分别代表的是什么,为什么要使用三个变量这么复杂地倒来倒去,而且这句话是在干啥我一开始也没看懂
- question3:这行我更困惑了,我以为是这么分隔的:
a, b = b, a + b
- 或者是
a, b = b, a + b
- question4:我最后整明白了,然鹅import了半天,依旧是错误的答案
(二)answer
- answer1: 函数名(形参)
其实这个max就是一个形参,所以在函数内部见不到跟它同名的很正常
因为它只是形式上的参数,实参是需要在调用函数的时候给的
e.g. - answer2:n, a, b = 0, 0, 1
从后面print(b)可以看出,b就是我们要的fibonacci数列结果
而这句语句其实是python的群体赋值(业余概括,非术语)方法
也就是等价于 n=0, a=0, b=1
n是用于控制循环次数的,而从b=a+b可知就是被加成员
从这件事上,我意识到了取一个通俗易懂的变量名对代码可读性的帮助有多大。=v=(明明就是自己菜) - answer3:a, b = b, a + b
知道了answer2之后,这句话也很简单,就是不断地将数字滚动赋值,从而得到数列结果 - answer4
代码写在Visial Studio Code(简称VSC,一种轻量级的IDE), 使用cmd窗口import之后调用函数
发现代码错误之后,修改IDE,并re-import,再一次调用
发现代码还是错的。
这件事的问题根本在于python是解释型的语言,cmd窗口一直在import和调用的,依旧是之前的文件版本
需要exit()之后重新执行才能更新到最新的文件
最后
鉴于我对这段代码的怨念(?)
我又重新倒腾了一下(其实就是给它们换件马甲)
- 在VSC IDE创建fibonacci.py文件
def fib(max): # max是形参,具体实参要等输入的是啥
n,pre,res=0,0,1 # 分别给n,pre,res赋值
while n<max: # fib(6)为例,需要循环0,1,2,3,4,5共六次
print(res)
pre,res= res,pre+res
#把res的值传到前一个pre,并且把<更替后的和>给res
n+=1
return 'done'
- 在IDE窗口输入命令执行(cmd也行,就是每次更改程序需要手动退出再敲一遍命令)