【发布时间】:2018-09-11 21:35:24
【问题描述】:
您将如何使用动态规划 (DP) 转换以下递归程序? 我只是在尝试将此代码重新定义为动态编程形式时遇到了一些麻烦。我确定了基本案例和一般案例,并且我知道 DP 是一种“自下而上”的方法。
int add(int, int);
int main()
{
int x = 0, y = 0;
printf("Enter positive integers x, y: ");
scanf("%d %d", &x, &y);
printf("Result: %d\n", add(x, y));
return 0;
}
int add(int x, int y)
{
if(x < 0 || y < 0){
fprintf(stderr, "Negative Integer received!\n");
return -1;
}
if (x == 1 || y == 1)
return 1;
else
return add(x, y-1) + add(x - 1, y) + add(x-1, y-1);
}
【问题讨论】:
-
递归真的在那里终止吗?似乎
add(x, y, z + 1)会一直保持下去。 -
DP 可以是自上而下或自下而上的。自上而下仍然是递归的,只是缓存了函数的先前结果。但是你需要先修复你的递归,就像 Ryan 说的那样。
-
我对参数的数量和递归做了一点修改。这可以转换成dp吗?
-
你没有在使用前声明
add(),所以它会使用可变参数的可变默认提升规则。而add(x, y-1, )不会编译 -
return add(x, y-1, ) + add(x - 1, y) + add(x-1, y-1);是无效的 C 代码。最清楚地发布真实代码。
标签: c algorithm recursion dynamic-programming