1D Peak,执行时表示错误导致代码停止工作

1D Peak, on execution says an error has caused the code to be stop working

我试图通过分而治之的技术在这个特定问题中找到一维峰, 我的程序即使它运行, 但在给出最终输出时,它说执行过程中出现了一些问题, 我从不同的方法得到了答案,但我想知道我错在哪里。

#include<iostream>

using namespace std;
int a[8];

class pg1
{
public:
    int func(int n)
    {
        if(a[n] <= a[n+1])
        {
            func(n++);
        }
        else if(a[n] <=a [n-1])
        {
            func(n--);
        }
        else
        {
            return n;
        }
    }
};

int main()
{   
    pg1 ob;
    for(int i=0;i<8;i++)
    {
        cin >> a[i];
    }
    int x = ob.func(4);
    cout << endl << x;
    return 0;
}

输入- 5个 6个 8个 5个 4个 3个 6个 4

错误是- 1D Peak.exe 已停止工作。 导致程序停止工作的问题 correctly.Windows 将关闭程序并在有可用解决方案时通知您。

最终结果- 进程退出 return 值 3221225725

不要在函数调用中使用后增量和类似的东西。

这是将问题浓缩为一段非常简单的代码

#include <iostream>

int test(int n){
    if(n == 1){
        std::cout << "Function called!";
        return test(n++);
    }else{
        return 0;
    }
}

int main() {
    test(1);
    return 0;
}

在你 运行 这之前,问问自己你期望在这里发生什么。和你想的一样吗?

当您 运行 执行此操作时,您会发现代码未正确终止。输出显示该函数被无限次调用,最终堆栈 运行 超出 space 并且程序崩溃。

您可以在此处查看此代码的运行情况:http://ideone.com/QL0jCP

在你的程序中你有同样的问题:

int func(int n)// say n = 4
{
    if(a[n] <= a[n+1])//say this is true
    {
        func(n++); //this calls func(4) THEN increments n afterwards
    }

这会用相同的值一遍又一遍地调用 func

解决方案是不要在函数调用中使用后递增或后递减。正如您在这个问题中看到的那样,这些会造成难以诊断的错误。只需一个简单的 func(n+1) 即可。如果您以后需要使用该变量,则只需创建一个显式变量即可,这样的编码风格要简洁得多(正如您 运行 进入此处所显示的这个问题)。

修复此问题后,您需要修复数组边界检查。

if(a[n] <= a[n+1])

如果 n 是数组中的最后一个位置,您突然试图访问数组末尾之后的一个位置,如果幸运的话,您会遇到段错误和崩溃,如果不幸的话,您得到一些很难找到的错误,这些错误会扰乱您的系统。您要检查值是否有效。