1D Peak, при выполнении говорит, что из-за ошибки код перестал работать

Я пытаюсь найти 1D пик с помощью техники «Разделяй и властвуй» в этом конкретном вопросе,
моя программа, даже если она работает,
но во время предоставления окончательного результата он говорит, что была некоторая проблема с выполнением,
Я получил ответ от другого метода, но я хотел бы знать, где я здесь виноват.

#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.
Неполадка привела к тому, что программа перестала работать правильно. Windows закроет программу и сообщит вам, если решение доступно.

Конечный результат-
Процесс завершен с возвращаемым значением 3221225725

-1

Решение

Не используйте postincrement и подобные в вызовах функций.

Вот проблема, сводящаяся к очень простому коду

#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;
}

Прежде чем запустить это, спросите себя, что вы ожидаете здесь произойти. Он сделал то, что вы думали?

Когда вы запустите это, вы увидите, что код не завершается должным образом. Выходные данные показывают, что функция вызывается бесконечно много раз, в конце концов стеку не хватает места и происходит сбой программы.

Вы можете увидеть этот код в действии здесь: 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 с одним и тем же значением снова и снова.

Решение состоит в том, чтобы не использовать postincrement или postdecrement в ваших вызовах функций. Они создают трудно диагностируемые ошибки, как вы видели в этом вопросе. Просто простой func(n+1) это все, что тебе нужно. Если вам понадобилось использовать переменную позже, просто создайте явную переменную, чтобы сделать это, это намного более чистый стиль кодирования (как показывает эта проблема, с которой вы столкнулись здесь).

После того, как вы это исправите, вам нужно будет исправить проверку границ массива.

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

Если n это последнее место в массиве, к которому вы внезапно пытаетесь получить доступ в одном месте за концом массива, если вам повезет, вы получите ошибку или сбой, если вам не повезет, вы получите какую-то ошибку, которая испортит вашу систему, что трудно найти. Вы хотите проверить правильность значений.

2

Другие решения


По вопросам рекламы [email protected]