Fibonacci

递归:

学校里有个很长的楼梯,一共有n级台阶,一个同学要从第0级上到第n级,每一步只能上1级或2级,一共有多少种方法?

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

int fib(n){return (2>n)?n:fib(n-1)+fib(n-2);}// 时间O(2^n)  空间o(n)

算67项需要10^5sec=1天,92项需要10^10sec=3century

低效的根源在于:各递归实例均被大量重复的调用

 

迭代改进:

方法A:记忆memoization

用一个表存储已计算出的递归实例,避免后面重复计算

方法B:动态规划

颠倒计算方向:由自顶向下递归,改为自底而上迭代

f=0;g=1;

while(0<n--)  {g=g+f;f=g-f;}

return g;//time: O(n);   space:  2

posted @ 2015-09-18 10:35  jack-xu  阅读(132)  评论(0)    收藏  举报