【问题标题】:Debugging Problem - I'm getting random outputs from a C++ program调试问题 - 我从 C++ 程序中获得随机输出
【发布时间】:2020-06-23 15:05:31
【问题描述】:

这是一个非常简单的代码,应该可以解决切割棒优化问题。大多数情况下它会输出正确的输出,但有时会给出随机答案。我不知道是什么原因造成的。

代码:

#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 作为答案。哪个是对的。但其他时候,它会给出一个随机的大数作为输出。

【问题讨论】:

  • int n = 10; int p[n] 不是有效的 C++。 n必须是const,或者直接改成int p[] = {…}
  • i &lt;= n in loop 应该是i &lt; n

标签: c++ algorithm optimization


【解决方案1】:
for (int i = 0; i <= n; ++i)
    {
        q = max(q, p[i] + cutRod(p, n-i-1));
    }

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

我猜这是导致问题的原因

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-23
    • 2013-01-11
    • 2018-08-23
    • 2023-04-10
    • 1970-01-01
    • 2020-03-15
    • 1970-01-01
    相关资源
    最近更新 更多