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


     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文件夹venvScriptspython.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文件夹venvScriptspython.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:untitledproject2venvScriptspython.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:untitledproject2venvScriptspython.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:untitledproject2venvScriptspython.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:untitledproject2venvScriptspython.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个数字。

  • 相关阅读:
    数据库路由中间件MyCat
    数据库路由中间件MyCat
    数据库路由中间件MyCat
    数据库路由中间件MyCat
    数据库路由中间件MyCat
    数据库路由中间件MyCat
    数据库路由中间件MyCat
    云架构师进阶攻略(3)
    PAT 1059. C语言竞赛
    PAT 1058. 选择题
  • 原文地址:https://www.cnblogs.com/linfengs/p/11637294.html
Copyright © 2020-2023  润新知