斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……
一.运用递归函数
1.递归函数:在函数的内部,可以调用其他的函数,如果一个函数在内部调用自身本身,这个函数就是递归函数.
2.使用递归解决问题的思路:
(1).写出临界条件
(2).找这一次和上一次的关系
(3).假设当前函数已经能用,调用自身计算上一次的结果,再求出本次的结果
思路:
'''
求斐波那契数列:1,1,2,3,5,8,13,21,34,55,89.....
找临界值f(1) = 1
f(2) = 1
f(3) = f(1)+f(2)
f(n) = f(n-1)+f(n-2)
'''
3.代码:
def func(n):
if n==1 or n==2:
return 1
else:
return func(n-1)+func(n-2)
print(func(4))
print(func(5))
print(func(6))
print(func(7))
print(func(40))
注意:使用递归函数需要注意防止栈溢出,在计算机中函数是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,就会增加一层栈帧,每当函数返回,栈就会减一层栈帧,栈的大小是有限制的,所以当调用的次数过多的时候,会导致栈溢出
4.运行结果:
二.运用for循环
for循环
语法:
for 变量 in 序列:
循环体
序列:列表 ,元组 ,字典 ,set集合 ,字符串 ,range
执行过程:依次从序列中取出一个元素赋值给变量,然后执行一次循环体,
继续去下一个,当所有的元素都被取出【序列为空】的情况下,循环完毕,退出循环。
2.代码:
def feibo(n):
a = 0
b = 1
if n == 1 or n == 2:
return 1
for x in range(1,n):
a,b = b,a+b
return b
print(feibo(1))
print(feibo(2))
print(feibo(3))
print(feibo(4))
print(feibo(5))
print(feibo(6))
print(feibo(7))
3.运行结果:
三.两者比较
递归考虑栈溢出,递归性能不如循环。n值大的话循环很快就能出结果,递归则很慢。递归函数的优点是定义简单,逻辑清晰,理论上所有的递归函数都可以写成循环的方式,但是循环的逻辑不如递归清晰.