min-max - algorytm rekurencyjny

Awatar użytkownika
Szemek
Użytkownik
Użytkownik
Posty: 4819
Rejestracja: 10 paź 2006, o 23:03
Płeć: Mężczyzna
Lokalizacja: Gdańsk
Podziękował: 43 razy
Pomógł: 1407 razy

min-max - algorytm rekurencyjny

Post autor: Szemek »

Próbowałem zaimplementować rekurencyjnie algorytm jednoczesnego wyszukiwania minimum i maksimum niestety przy debugowaniu wyskakuje "Stack overflow" dla wartości i=2, j=1. Z tego co widzę program wpada w nieskończone wywołanie funkcji min_max
Będę wdzięczny za poprawę algorytmu, bo rekurencja nie jest moją mocną stroną.

Kod: Zaznacz cały

#include<iostream>
using namespace std;

int e[10];

struct para
{
	int min,max;
};

para wynik, lewy, prawy;
para min_max(int i, int j)
{
	if(i+1==j)
	{
		if(e[j]>e[i])
		{
			wynik.max = j;
			wynik.min = i;
		}
		else
		{
			wynik.max = i;
			wynik.min = j;
		}
	}
	else
	{
			int x = (i+j-1)/2;
				lewy = min_max(i,x);
				prawy = min_max(x+1,j);
				if(e[prawy.min]<e[lewy.min])
					wynik.min = prawy.min;
				else
					wynik.min = lewy.min;
				if(e[lewy.max]<e[prawy.max])
					wynik.max = prawy.max;
				else
					wynik.max = lewy.max;
	}
	return wynik;
}

int main()
{
	int n = 10;
	for(int i=0;i<n;i++)
	{
		cin>>e[i];
	}
	para mm = min_max(0,9);
	cout<<"Minimum = " << e[mm.min] << ", maksimum = " << e[mm.max] << endl;
}
abc666

min-max - algorytm rekurencyjny

Post autor: abc666 »

ten warunek

Kod: Zaznacz cały

i+1==j
jest niebezpieczny, spróbuj zastąpić to przez

Kod: Zaznacz cały

j-i<=1
Awatar użytkownika
Szemek
Użytkownik
Użytkownik
Posty: 4819
Rejestracja: 10 paź 2006, o 23:03
Płeć: Mężczyzna
Lokalizacja: Gdańsk
Podziękował: 43 razy
Pomógł: 1407 razy

min-max - algorytm rekurencyjny

Post autor: Szemek »

powyższa zmiana i tak nie daje poprawnych wyników
abc666

min-max - algorytm rekurencyjny

Post autor: abc666 »

W sumie to nie analizowałem twojego kodu tylko od razu mi się rzucił w oczy ten warunek. Zaraz zobaczę dokładniej w czym problem.
Awatar użytkownika
flashion
Użytkownik
Użytkownik
Posty: 113
Rejestracja: 20 sty 2009, o 01:27
Płeć: Mężczyzna
Podziękował: 6 razy
Pomógł: 7 razy

min-max - algorytm rekurencyjny

Post autor: flashion »

zmienne:

Kod: Zaznacz cały

para lewy, prawy;
powinny być definiowane wewnątrz funkcji.

zrobiłeś jedne dla wszystkich.
stwarza to błąd np. przy min_max(0,1) i (2,4). dla (2,4) obliczy, ale przy (0,4) nie będą istniały wyniki z (0,1). zostaną zastąpione bodajże przez wyniki z (2,3).
Awatar użytkownika
Szemek
Użytkownik
Użytkownik
Posty: 4819
Rejestracja: 10 paź 2006, o 23:03
Płeć: Mężczyzna
Lokalizacja: Gdańsk
Podziękował: 43 razy
Pomógł: 1407 razy

min-max - algorytm rekurencyjny

Post autor: Szemek »

dzięki abc666
dzięki flashion,
właśnie w tych dwóch punktach przez was wskazanych tkwił problem mojego programu
ODPOWIEDZ