首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >动态编程与递归有多大不同

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

Stack Overflow用户
提问于 2020-09-30 15:09:43
回答 1查看 29关注 0票数 0

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

EN

回答 1

Stack Overflow用户

发布于 2020-09-30 19:02:47

在动态编程中有两种方法,自上而下和自下而上。

让我们以斐波那契数列为例:

f(0) =0:x= 1,

f(1) =1:x= 1,

f(x) = f(x-1) + f(x-2):x>1

自上而下的方法:

它使用递归+记忆(存储计算的状态以避免重新计算):

代码语言:javascript
运行
复制
int memo[1000];//initialized by zeroes

int f(int x) {
    if (x == 0 || x == 1) return 1;
    if (memo[x] != 0) return memo[x]; //trying to avoid recalculation
    memo[x] = f(x - 1) + f(x - 2); //storing the result
    return memo[x];
}

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

自下而上的方法:

它使用循环(for,while...)而不是递归,并将值存储在数组中:

代码语言:javascript
运行
复制
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];
}

正如你注意到的,我们计算斐波那契数列的值,从小到大,这就是为什么它被称为自下而上。

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

递归代码将多次调用自身,您应该知道每个函数调用都将存储在内存堆栈中,因此最好使用迭代方法,因为它对内存和性能更好。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64132558

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档