这是我在网上随机找到的一些关于动态编程的讲座中读到的一个问题。(我毕业了,我已经知道动态规划的基础了)
在解释为什么需要记忆的部分,即
// psuedo code
int F[100000] = {0};
int fibonacci(int x){
if(x <= 1) return x;
if(F[x]>0) return F[x];
return F[x] = fibonacci(x-1) + fibonacci(x-2);
}
如果不使用 memoization,那么许多子问题将被重新计算很多次,这使得复杂度非常高。
然后在一页上,笔记有一个没有答案的问题,这正是我想问的。在这里,我使用了确切的措辞和它显示的示例:
自动记忆:许多函数式编程语言(例如 Lisp)都内置了对记忆的支持。
为什么不用命令式语言(例如 Java)?
注释提供的 LISP 示例(它声称它是有效的):
(defun F (n)
(if
(<= n 1)
n
(+ (F (- n 1)) (F (- n 2)))))
它提供的 Java 示例(它声称它是指数级的)
static int F(int n) {
if (n <= 1) return n;
else return F(n-1) + F(n-2);
}
在阅读本文之前,我什至不知道某些编程语言中内置了对记忆的支持。
注释中的说法是否属实?如果是,那么为什么命令式语言不支持它?