下面是斐波那契数的最优美算法:
几乎所有关于递归算法的讨论都要用到这个例子,它以最简单的方式解决问题,但是很遗憾,这段代码永远不可能应用于实际,我甚至不情愿输入10以上的参数。
任何递归都可以用循环代替,斐波那契数也一样:
上面的代码可以在线性时间内解决问题。
如果既想提高效率又想保留递归的优美,可以对它进行一个小小的诠释:
性能的提高是显著的,如果频繁的调用gatFab方法,它会使你的效率成倍提高,你甚至可以在常数时间内得到结果,我们称这种方法为动态编程。
再来看看著名的贪心算法。
贪心算法也叫背包算法,一个背着帆布口袋的小偷盗窃了一个装满贵重物品的保险柜,小偷想尽办法让自己有限的帆布袋装进最有价值的物品,我们正是要帮助他解决这个问题。
贵重物品的结构如下:
最直接的方法还是递归:
可惜的是它同样不能应用于实际,其运行时间达到了指数级。
既然知道了动态编程,我们也可以对它做一个改进:
这次可以放心的运行,唯一的限制就是你是否担负的起maxKnown的空间开销。当然,我并不想把这个方法告诉小偷。
以上是动态编程的两个例子,一个穿着背带裤并且满脸青春痘的小家伙启发我使用这种方法,我总结出来,希望对今后的编程工作有所帮助。