例子:循环语句--斐波那契数列

 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个数字。

猜你喜欢

转载自www.cnblogs.com/linfengs/p/11637294.html