c++ - 调试问题 - 我从 C++ 程序中得到随机输出
问题描述
这是一个非常简单的代码,应该可以解决切割杆优化问题。大多数情况下它会输出正确的输出,但有时会给出随机答案。我不知道这可能是什么原因造成的。
代码:
#include <iostream>
#include <limits>
int cutRod(int p[], int n);
int max(int a, int b);
int main()
{
int n = 10;
int p[n] = {1, 5, 8, 9, 10, 17, 17, 20, 24, 30};
int numOfCuts = cutRod(p, n);
std::cout << "Cuts: " << numOfCuts << std::endl;
return 0;
}
int cutRod(int p[], int n)
{
if (n == 0)
{
return 0;
}
int q = INT32_MIN;
for (int i = 0; i <= n; ++i)
{
q = max(q, p[i] + cutRod(p, n-i-1));
}
return q;
}
int max(int a, int b){
if (a >= b)
{
return a;
}
else if (b > a)
{
return b;
}
}
如何重新生成错误:
只需运行该程序几次。大多数时候,它给出 30 作为答案。哪个是对的。但其他时候,它会给出一个随机的大数作为输出。
解决方案
for (int i = 0; i <= n; ++i)
{
q = max(q, p[i] + cutRod(p, n-i-1));
}
在这里,您调用的是超出索引的 p[n],但在 c++ 数组中,它仍然允许您访问具有垃圾值的内存块,因此您基本上是在添加一个带有函数返回值的垃圾值。在数组中,p 的有效值最多只有 0 到 n - 1,
我想这是导致问题的原因
推荐阅读
- r - 识别 dplyr 中订阅事务的用户计划行为开关
- amazon-web-services - 未发送到死信队列的失败事件?
- oracle - 是否可以在列表分区表中自动创建新分区?
- openssl - keytool 错误:java.io.IOException:DER 输入,整数标记错误
- javascript - 谷歌闭包编译器:类作为函数参数
- c# - 未找到类型的构造函数 .NET Core
- css - 使用 @emotion/styled 设置材质 UI 工具提示
- python - ManyToMany 字段在单元测试中返回 None
- docker-compose - ddev start - 无法加载任何 docker-compose.*y*l 文件
- firebase - 反应原生 | Firebase Firestore | 仅在按两次后存储用户数据