斐波拉契数列之动态规划算法
-
问题:
https://baike.baidu.com/item/斐波那契数列/99145
有一对兔子,从出生后的第3个月起每个月都生一对兔子。 小兔子长到第3个月后每个月又生一对兔子,假设所有的兔子都不死,问40个月内每个月的兔子总数为多少? 幼仔对数=前月成兔对数 成兔对数=前月成兔对数+前月幼仔对数 总体对数=本月成兔对数+本月幼仔对数 依次类推可以列出下表: 经过月数 1 2 3 4 5 6 7 8 9 10 11 12 幼仔对数 1 0 1 1 2 3 5 8 13 21 34 55 成兔对数 0 1 1 2 3 5 8 13 21 34 55 89 总体对数 1 1 2 3 5 8 13 21 34 55 89 144
-
递归算法:
#!/usr/bin/env python # -*- coding: utf-8 -*- def fib(n): if n <= 2: return 1 else: return fib(n - 1) + fib(n - 2) r = fib(40) #print(r)
耗时:
time python fib_recurse.py real 0m23.555s user 0m23.499s sys 0m0.045
-
动态规划算法:
#!/usr/bin/env python # -*- coding: utf-8 -*- f = {} def fib(n): global f result = 0 if(n < 1): return -1 else: if(n == 1 or n == 2): return 1 else: if f.has_key(n): return f[n] else: f[n] = fib(n-1) + fib(n-2) return f[n] r = fib(40)
耗时:
time python fib_dp.py real 0m0.037s user 0m0.014s sys 0m0.020s
-
Ref: