又见fibonacci数

    转自我的新浪博客,搬家了!!!

    fibonacci(斐波那契数)应该很熟悉了。平常的解法都是用递归,这样的确是很好的解决,但是很花费时间,有些数据要算很多遍,尤其是下标小的数。

    昨天看书发现用动态规划的方法求解fibonacci数列,后来发现维基百科上也提到了这种,的确是大大的节约了时间,尤其是当要算一个很大很大的数时。
    用常规方法解决求Fibonacci数列。寻找Fibonacci序列的第n个数,基于数学定义直接实现:
function fib(int n)
{
	if(n == 0) return 1;
	if(n ==1) return 1;
	else return fib(n-1) + fib(n-2);
}
     如果要算fib(5),那么要算3遍的fib(2),和2遍的fib(3),在更大的规模例子中,将有更多的fib值重复计算,将消耗更多的时间指数级时间。
    但是用动态规划就不同了,现在,假设有一个简单的映射(map)对象m,为每一个计算过的fib及其返回值建立映射,修改上面的函数fib,使用并不断更新m。新的函数讲只需O(n)的时间,而非指数时间。
实现代码:
int fib(int n)
{
    if(!bn[n])
    {
        m[n] = fib(n-1) + fib(n-2);
        bn[n] = true;
    }
    return m[n];
}
     例如同样求fib(5),这种方法只需求一次fib(2),然后用它来计算fib(3)、fib(4),而不需要重复计算。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值