提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
写文章主要是想提升自己代码与算法能力,有时总是看完理解,但轮到自己写的时候却写不出。之前都是写其他语言的多写写算法提升一下写python的能力。
一、问题
斐波那契数列是指这样一个数列:0,1,1,2,3,5,8,13,21,34,55,89……这个数列从第3项开始 ,每一项都等于前两项之和。求斐波那契数列第26个数字是多少
二、递归的特征
特征一.调用自身
斐波那契数列有很明显的特征就是结果F(n)与他上两个数F(n-1),F(n-2)有关,F(n-1)的值与他上两个数F(n-2),F(n-3)有关。一直这样找出函数的上一个值。
我们先定义一个方法
def Fibonacci(n):
return Fibonacci(n-1)+Fibonacci(n-2)
这段代码也就是F(n)=F(n-1)+F(n-2)
只是这样肯定是不行的python会直接报错。
特征二.结束条件
如果一直这样调用自身很明显是一个死循环,所以我们要让函数跳出死循环,就要写结束条件。那结束条件是什么呢?观察现在的函数我们可以发现n<0也能继续运行,但是斐波那契数列并没有小于0的数,所以我们第一个条件就是n不能小于0
def Fibonacci(n):
if n<=0:
return 0
else:
return Fibonacci(n-1)+Fibonacci(n-2)
我们会发现无论输入什么结果都是0,那是因为一直递归下去都会成为负数所以返回值都是0比如:n=3
Fibonacci(2)+Fibonacci(1),我们先别看后面+Fibonacci(1),Fibonacci(2)值并不知道继续递归n=2
Fibonacci(1)+Fibonacci(0),Fibonacci(1)同理。递归n=1
Fibonacci(0)+Fibonacci(-1)=0。这时因为我代码里小于等于0的数都返回0于是这样的结果就是0。
我们要有第二个条件,第二个条件就是斐波那契数列第二个数字1
def Fibonacci(n):
if n<=0:
return 0
elif n==1:
return 1
else:
return Fibonacci(n-1)+Fibonacci(n-2)
这样递归的调用自身与结束条件都写好了,我们可以运行一下。
def Fibonacci(n):
if n<=0:
return 0
elif n==1:
return 1
else:
return Fibonacci(n-1)+Fibonacci(n-2)
print(Fibonacci(26))
这里python会直接输出
121393
三、递归解决斐波那契数列的局限性
递归并不是最好的解决斐波那契数列第n个数是几的方法。在实际运行时会发现当求第40个以上斐波那契数列时就会变慢,运行时尽量用小一点的数字。但斐波那契数列确实是一个递归很好的例子,所以我才举例斐波那契数列作为递归的介绍。
5507

被折叠的 条评论
为什么被折叠?



