HMHYY 2019-03-19
1. 元组实现
代码:
fibs = [0, 1] for i in range(8): fibs.append(fibs[-2] + fibs[-1]) print(fibs)
输出:
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
2. 迭代器实现
class Fibs: def __init__(self): self.a = 0 self.b = 1 def next(self): self.a, self.b = self.b, self.a + self.b return self.a def __iter__(self): return self
这将得到一个无穷的数列, 可以采用如下方式访问:
fibs = Fibs() for f in fibs: if f > 1000: print(f) break else: print(f)
3. 通过定制类实现
class Fib(object):
def __getitem__(self, n):
if isinstance(n, int):
a, b = 1, 1
for x in range(n):
a, b = b, a + b
return a
elif isinstance(n, slice):
start = n.start
stop = n.stop
a, b = 1, 1
L = []
for x in range(stop):
if x >= start:
L.append(a)
a, b = b, a + b
return L
else:
raise TypeError("Fib indices must be integers")
这样可以得到一个类似于序列的数据结构,可以通过下标来访问数据:
f = Fib() print (f[0:10])
4.Python实现比较简易的斐波那契数列示例
i, j = 0, 1 while i < 10000: print( i,j, = j, i+j)
最后展示运行结果:
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765
5.列表生成式实现
def fib(n):
if n == 1 or n == 0:
return 1
else:
return fib(n - 2) + fib(n - 1)
print([fib(n) for n in range(10)])
这个计算斐波那契数列前n项很简单,但是从下面的图可以看出这个计算花费的时间较多因为会重复计算很多值。
Paste_Image.png
这个时候我需要修改一下,加入缓存机制。def fib(n, cache=None): if cache is None: cache = {} if n in cache: return cache[n] if n == 1 or n == 0: return 1 else: cache[n] = fib(n - 2, cache) + fib(n - 1, cache) return cache[n] print([fib(n) for n in range(999)])
这样即使是n的值很大也能很快的计算很出来。
pytyhon学习资料
python学习资料
动态规划有时被称为递归的相反的技术。动态规划方案通常使用一个数组来建立一张表,用于存放被分解成众多子问题的解。当算法执行完毕,最终的解法将会在这个表中找到。今天我们先从我们最熟的斐波那契数列数列开始。