数据结构——斐波那契与汉诺塔

斐波那契

斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列以如下被以递归的方法定义:F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>=2,n∈N*)

递归法

def fib_recur(n):
  if n <= 1:
    return n
  return fib_recur(n-1) + fib_recur(n-2)
for i in range(1, 20):
    print(fib_recur(i), end=' ')

写法最简洁,但是效率最低,会出现大量的重复计算,时间复杂度O(1.618^n),而且最深度1000

递推法

def fib_loop(n):
  a, b = 0, 1
  for i in range(n + 1):
    a, b = b, a + b
  return a

for i in range(1, 20):
     print(fib_loop(i), end=' ')

递推法,就是递增法,时间复杂度是 O(n),呈线性增长,如果数据量巨大,速度会越拖越慢

生成器

def fib_loop_while(max):
    a, b = 0, 1
    while max > 0:
        a, b = b, a + b
        max -= 1
        yield a


for i in fib_loop_while(10):
    print(i)

带有yield的函数都被看成生成器,生成器是可迭代对象,且具备__iter__ 和 __next__方法, 可以遍历获取元素
python要求迭代器本身也是可迭代的,所以我们还要为迭代器实现__iter__方法,而__iter__方法要返回一个迭代器,迭代器自身正是一个迭代器,所以迭代器的__iter__方法返回自身即可

汉诺塔问题

 

def hanoi(n,x,y,z):
if n == 1:
print(x,"-->", z)
else:
hanoi(n-1,x,z,y)
print(x, "-->",z)
hanoi(n - 1, y, x, z)
while True:
n = int(input("请输入汉诺塔的层数:"))
hanoi(n, "x", "y", "z")

猜你喜欢

转载自www.cnblogs.com/tracydzf/p/12542915.html