Recursion 动态编程与递归有多大不同

Recursion 动态编程与递归有多大不同,recursion,dynamic-programming,Recursion,Dynamic Programming,我听说,如果你能编写一个递归代码,你就可以把它转换成一个动态编程代码,但是有什么必要这样做呢?如何将递归代码转换为DP?在动态规划中,有两种方法,自顶向下和自下而上。 以斐波那契序列为例: f(0)=0:x=1, f(1)=1:x=1, f(x)=f(x-1)+f(x-2):x>1 自上而下的方法: 它使用递归+记忆(存储计算的状态以避免重新计算): 正如你在这里注意到的,为了计算f(x),我们必须把它分解成 f(x-1)和f(x-2),这就是为什么它被称为自顶向下。 自下而上的方法: 它使用循

我听说,如果你能编写一个递归代码,你就可以把它转换成一个动态编程代码,但是有什么必要这样做呢?如何将递归代码转换为DP?

在动态规划中,有两种方法,自顶向下和自下而上。

以斐波那契序列为例:
f(0)=0:x=1,
f(1)=1:x=1,
f(x)=f(x-1)+f(x-2):x>1

自上而下的方法:
它使用递归+记忆(存储计算的状态以避免重新计算):

正如你在这里注意到的,为了计算f(x),我们必须把它分解成 f(x-1)和f(x-2),这就是为什么它被称为自顶向下。

自下而上的方法:
它使用循环(for,while…)而不是递归,并将值存储在数组中:

int memo[1000];

int bottom_up(int x) {
    memo[0] = 1;
    memo[1] = 1;
    for (int i = 2; i < 1000; i++)
        memo[i] = memo[i - 1] + memo[i - 2];
}
int memo[1000];
整数自底向上(整数x){
备注[0]=1;
备忘录[1]=1;
对于(int i=2;i<1000;i++)
备忘录[i]=备忘录[i-1]+备忘录[i-2];
}
正如您所注意到的,我们计算斐波那契序列的值,从较小的值到较大的值,这就是为什么它被称为自底向上。

将代码从递归转换为循环被认为是将递归代码转换为迭代代码。

递归代码将多次调用自身,并且您应该知道每个函数调用都将存储在内存堆栈中,因此最好使用迭代方法,因为这样会更好地提高内存和性能

int memo[1000];

int bottom_up(int x) {
    memo[0] = 1;
    memo[1] = 1;
    for (int i = 2; i < 1000; i++)
        memo[i] = memo[i - 1] + memo[i - 2];
}