首页 > 解决方案 > 调试问题 - 我从 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 作为答案。哪个是对的。但其他时候,它会给出一个随机的大数作为输出。

标签: c++algorithmoptimization

解决方案


for (int i = 0; i <= n; ++i)
    {
        q = max(q, p[i] + cutRod(p, n-i-1));
    }

在这里,您调用的是超出索引的 p[n],但在 c++ 数组中,它仍然允许您访问具有垃圾值的内存块,因此您基本上是在添加一个带有函数返回值的垃圾值。在数组中,p 的有效值最多只有 0 到 n - 1,

我想这是导致问题的原因


推荐阅读