Python学习笔记1——斐波那契数列

这是一个高中同学问我的问题,本来是用C来写的,正好正在学Python,就用Python重写了一遍当作练习。

下面是题目要求:

一道很简单的题目,但有些细节还是要注意的,我第一次写的代码在细节上就不是很完美。

首先来看看什么是Fibonacci数列。

斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1, F(n)=F(n-1)+F(n-2)(n>=2,n∈N*)在现代物理、准晶体结构、化学等领域,斐波纳契数列都有直接的应用,为此,美国数学会从1963起出版了以《斐波纳契数列季刊》为名的一份数学杂志,用于专门刊载这方面的研究成果。

以上说明来自百度百科,不难看出,Fibonacci其实就是由前两项计算第三项的数列。为了求第n项Fibonacci数列的项,自然而然想到了递归。以下是求第n项Fibonacci的函数。

1deffib(n):

2ifn==1orn==2:

3return1

4else:

5returnfib(n-1)+fib(n-2)

写C写习惯了,有些地方容易错,比如冒号。

这个函数很好理解,不作过多说明。

我们再来看第二个要求,最简单的想法就是一个一个求,直到所求的数比上限大为止。我用的就是这种办法,因为Fibonacci数列增长的特别快,所以一般不用求多少项(100项以内)就能得出答案。下面是我最一开始写的代码:

1defPrintFN(m, n):

2i=1

3j=

4whilefib(i)

5i = i+1

6whilefib(i)

7ifj!=0:

8print""

9printfib(i)

10j = j+1

11i = i+1

12ifj==0 :

13print"No Fibonacci number!"

一开始用了自增符号,发现报错,才知道Python里没有自增符号,具体原因以后我会专门写一篇比较C和Python的文章进行详述。

然而,这段代码测试没有通过,当上限刚好是Fibonacci数时,会少输出上限,所以在第二个while的条件里加了个等号,还有一点,当上下限都是1的时候,由于数列的第一项和第二项都是1,所以1会输出两次。经过一番修改,最终的代码如下:

1deffib(n):

2ifn==1orn==2:

3return1

4else:

5returnfib(n-1)+fib(n-2)

6

7defPrintFN(m, n):

8i=1

9j=

10whilefib(i)

11i = i+1

12whilefib(i)

13ifj!=0:

14print"",

15printfib(i),

16j = j+1

17i = i+1

18ifi==2:

19i = i+1

20ifj==0 :

21print"No Fibonacci number",

22

23m = input("m=")

24n = input("n=")

25t = input("t=")

26print("fib(%d) = %d \n"%(t, fib(t)))

27PrintFN(m, n)

由于我用的python2.7,只能在ptint后加逗号来不让它换行,但这样就不能完全符合题目要求了,因为加逗号后会有个空格。这部分暂时没办法修改,不过大体功能已经实现了!

最后,让我们总结一下这个程序用了Python的哪些知识点:

变量

输入与输出,格式化输出

运算

函数

流程控制:判断、循环

这一次到这为止,第一次写这类博文(以前可是知名情感博主),希望自己能坚持下去!

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20171227G00PRS00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券