斐波那契数小结

斐波那契的传说:

     假定你有一雄一雌一对刚出生的兔子,它们在长到一个月大小时开始交配,在第二月结束时,雌兔子产下另一对兔子,过了一个月后它们也开始繁殖,如此这般持续下去。每只雌兔在开始繁殖时每月都产下一对兔子,假定没有兔子死亡,在一年后总共会有多少对兔子?

     在一月底,最初的一对兔子交配,但是还只有1对兔子;在二月底,雌兔产下一对兔子,共有2对兔子;在三月底,最老的雌兔产下第二对兔子,共有3对兔子;在四月底,最老的雌兔产下第三对兔子,两个月前生的雌兔产下一对兔子,共有5对兔子;……如此这般计算下去,兔子对数分别是:1, 1, 2, 3, 5, 8, 13, 21, 34, 55,89, 144, ...看出规律了吗?从第3个数目开始,每个数目都是前面两个数目之和。这就是著名的斐波那契(Fibonacci)数列。

斐波那契函数:

      f(n)=f(n-1)+f(n-2)

由函数很容易得到程序:

1 def fib(n):
2     return 1 if n in (0, 1) else fib(n-1)+fib(n-2)

但是递归毕竟耗时又耗空间, 存在大量的重复计算, 为了去除重复的计算, 可以用

 

动态规划的思想将递归所求的值放到一个数组中

result = [0 for i in xrange(1000)]
result[0] = result[1] = 1

def fib(n):
    global result
    if result[n] != 1:
        return result[n]
    else:
        result[n] = fib(n-1)+fib(n-2)
        return result[n]

 

但是毕竟自顶向下, 还是用到了递归, 所以我们就把递归改成迭代吧

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

只用两个内存, 灰常省空间。

总结, 递归符合人的思维从上往下, 动态规划可以大幅度减少递归过程中的重复, 迭代省内存又快但是是自底向上, 不符合人的思维方式。

 

posted @ 2013-02-22 14:20  run-forever  阅读(201)  评论(0编辑  收藏  举报