1 # coding=gbk 2 count = 0 3 a = int(input('请输入第一个数:')) 4 b = int(input('请输入第二个数:')) 5 print('以该两位数开始的1000之内的斐波那契数列为:',end='') 6 print(a,b,end=' ') 7 while (a + b) < 1000: 8 count += 1 9 if count == 1: 10 a = a + b 11 print(a,end=' ') 12 else: 13 a = a + b 14 print(a,end=' ') 15 b = a - b 16 ############################################# 17 E:\python文件夹\venv\Scripts\python.exe E:/python文件夹/jiujiu.py 18 请输入第一个数:1 19 请输入第二个数:1 20 以该两位数开始的1000之内的斐波那契数列为:1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 21 Process finished with exit code 0 22 ############################################# 23 E:\python文件夹\venv\Scripts\python.exe E:/python文件夹/jiujiu.py 24 请输入第一个数:1 25 请输入第二个数:3 26 以该两位数开始的1000之内的斐波那契数列为:1 3 4 7 11 18 29 47 76 123 199 322 521 843 27 Process finished with exit code 0
斐波那契数列的定义为:F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>=3,n∈N*),即根据前两个数相加得出后一个数,例如:1,1,2,3,5,8,13,21,34,55……那么根据这个公式,我们可以肯定的是代码可以使用循环来做(代码7行开始),即然是循环,因为前两个数是不固定给出的,可列为是特殊的情况,因此需要一个计数变量count,当count=1的时候,即为前两个数a和b的第一次相加(即代码9~11行),然后剩下的情况有规律可循,相加的值作为加数,加数减掉上一个循环的被加数(即上一个循环的加数)开始新的一轮循环(即代码13~15行)。这里要注意的是代码7行的判断条件,这里是a+b小于1000,如果是a小于1000的话,相当于多了一个循环结果,会有一个超过1000的数字出现,不符合题意。
再看代码10-11和13-14,这两对代码是完全相同的,那么有没有优化的可行性呢?其实,代码还可以写成如下的形式:
1 # coding=gbk 2 a = int(input('请输入第一个数:')) 3 b = int(input('请输入第二个数:')) 4 c = 0 5 print('以该两位数开始的1000之内的斐波那契数列为:',end='') 6 print(a,b,end=' ') 7 while (a + b) < 1000: 8 c = a + b 9 print(c,end=' ') 10 a = b 11 b = c 12 ########################################## 13 D:\untitled\project2\venv\Scripts\python.exe D:/untitled/project2/day1/feibonaqi.py 14 请输入第一个数:1 15 请输入第二个数:4 16 以该两位数开始的1000之内的斐波那契数列为:1 4 5 9 14 23 37 60 97 157 254 411 665 17 Process finished with exit code 0
可以设一个变量c来当做中间替换变量使用,这里要注意的是,没有特殊情况了,相对来说也更加的容易理解。比如a=1,b=4,那么第一次进入循环,1+4=5<1000,c=a+b=5,输出c,a=b,a从初始值1变成4,b=c,b从初始值4变成了5,而4和5又正好是第二次循环的加数与被加数,如此循环,直至a+b的值大于1000的时候,循环终止。
上面的两种代码都强调了顺序问题,比如,a=a+b,b=a-b以及a=b,b=c,我们还可以使用赋值运算来更好的优化代码,如下所示:
1 # coding=gbk 2 a = int(input('请输入第一个数:')) 3 b = int(input('请输入第二个数:')) 4 print('以该两位数开始的1000之内的斐波那契数列为:',end='') 5 print(a,end=' ') 6 while b < 1000: 7 print(b,end=' ') 8 a , b = b , a + b 9 ############################################## 10 D:\untitled\project2\venv\Scripts\python.exe D:/untitled/project2/day1/feibonaqi.py 11 请输入第一个数:1 12 请输入第二个数:4 13 以该两位数开始的1000之内的斐波那契数列为:1 4 5 9 14 23 37 60 97 157 254 411 665 14 Process finished with exit code 0
这里就要注意a,b=b,a+b这个公式了,这是赋值运算,先运算再赋值。
1 a = 0 2 b = 1 3 a , b = b , a + b 4 # 这种赋值,先计算等值 右边 就是 b=1 a+b=0+1=1 5 # 再赋值给a和b,那么 a=1, b=1 6 # 然后就是依次这样 7 ################################# 8 a = b 9 # 此时a=1 10 b = a + b 11 # b=1+1=2
例子拓展:求一个斐波那契数列的第n位数字,比如前两位为2,6的斐波那契数列的第8位数字是什么?
2,6,8,14,22,36,58,94,152……
1 # coding=gbk 2 a = int(input('请输入第一个数:')) 3 b = int(input('请输入第二个数:')) 4 count = int(input('请输入你想查找的该斐波那契数列的位数:')) 5 if count == 1: 6 print('第1位数是:' + str(a)) 7 else: 8 for n in range(2,count): 9 a , b = b , a + b 10 print('第' + str(count) + '位数是:' + str(b)) 11 ############################################ 12 D:\untitled\project2\venv\Scripts\python.exe D:/untitled/project2/day1/feibonaqi.py 13 请输入第一个数:2 14 请输入第二个数:6 15 请输入你想查找的该斐波那契数列的位数:8 16 第8位数是:94 17 18 Process finished with exit code 0 19 ############################################ 20 D:\untitled\project2\venv\Scripts\python.exe D:/untitled/project2/day1/feibonaqi.py 21 请输入第一个数:2 22 请输入第二个数:6 23 请输入你想查找的该斐波那契数列的位数:1 24 第1位数是:2 25 26 Process finished with exit code 0
分析上述的代码,第一个数字是必须输入的,可算作一个特殊的情况,独立出来(即代码5~6行)。剩下的从第2个数字开始进行循环计算,这里要注意的是循环次数范围,比如要查找第8个数字,count=8,range(2,count)的取值范围为2~7,循环了6次,得出的是第7个数,那么在加上第1个数,这第7个数实际上是第8个数字。