尾递归和动态编程是一样的吗?

时间:2012-09-29 04:40:44

标签: dynamic-programming tail-recursion

我使用尾递归编写Fibonacci数字,它背后的想法似乎与动态编程相同。他们一样吗?或者说它们之间有一些相似之处?如果不是什么时候他们变得不同?

3 个答案:

答案 0 :(得分:3)

这些术语本身虽然相关,但无论如何都不相同:

  • 动态编程是一种解决问题的方法,可以使用或不使用尾递归来实现。更一般地说,它需要“记忆”。

  • 尾递归是实现动态编程算法的常用方法,因为它专门将记忆逻辑应用于特定字段。

答案 1 :(得分:1)

动态编程通常是执行与尾递归相同的任务的更有效方法。主要区别在于动态编程存储已经计算的结果,这样如果同一操作出现,而不是再次运行代码,则只需查找该值。这会占用更多空间/内存,但会产生更快的算法。

在fibonacci的情况下,动态编程解决方案是不断添加数组中的最后两个元素以获得下一个元素。尾递归解决方案将从头开始计算斐波纳契的每个值。

答案 2 :(得分:1)

我明白你为什么问这个问题。动态编程背后的想法是将问题分解为更小的问题,这是许多递归(尾部或非部分)函数背后的完全相同的想法。

这真是一个苹果到橙子的比较,有很多好的答案,但这里有一件事让你意识到为什么很难比较这两个想法:在某些语言,包括Java,你在技术上不能使用尾递归。您可能知道,尾递归函数不会存储其调用的结果堆栈,并在以后使用它们。但是,在Java中,为每个方法调用维护堆栈跟踪。这使用堆栈空间,如果运行太多次,可以堆栈溢出。因此,任何可能看起来都是尾递归的Java方法实际上都不是。