求斐波拉契的简单方法

斐波那契数列(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.运行结果:


image.png

二.运用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.运行结果:


image.png

三.两者比较
递归考虑栈溢出,递归性能不如循环。n值大的话循环很快就能出结果,递归则很慢。递归函数的优点是定义简单,逻辑清晰,理论上所有的递归函数都可以写成循环的方式,但是循环的逻辑不如递归清晰.

你可能感兴趣的:(求斐波拉契的简单方法)