这是一个高中同学问我的问题,本来是用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的哪些知识点:
变量
输入与输出,格式化输出
运算
函数
流程控制:判断、循环
这一次到这为止,第一次写这类博文(以前可是知名情感博主),希望自己能坚持下去!
领取专属 10元无门槛券
私享最新 技术干货