• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Rekurencja - wartości min oraz max z tablicy

0 głosów
69 wizyt
pytanie zadane 6 dni temu w C i C++ przez Jedyn Obywatel (1,000 p.)

Witam. Tak jak w temacie, potrzebuję napisać program wybierający z tablicy min oraz max, musi być on napisany rekurencyjnie. Mój który napisałem wywala mi liczbę minimalną której nie ma w zbiorze (coś typu -8324123). Kod: 

void innyprogram(int *tab, int n, int min, int max)
{
	if(n>0)
	{
		if (min > tab[n-1])
		{
			min = tab[n-1];
		}
		else if (max < tab[n-1])
		{
			max = tab[n-1];
		}
		if (n - 1 >= 1)
		{
			return innyprogram(tab, n - 1, min, max);
		}
	}
	cout << min << " " << max;
	
}


int main()
{
	int *tab, n;
	n = 11;
	tab = new int[n];

	tab[0] = 32;
	tab[1] = 54;
	tab[3] = 9;
	tab[4] = 12;
	tab[5] = 1;
	tab[6] = 323;
	tab[7] = 14;
	tab[8] = 90;
	tab[9] = 234;
	tab[10] = 7;

	innyprogram(tab, n, tab[0], tab[0]);
	char c;
	cin >> c;
    return 0;
}

 

komentarz 6 dni temu przez RobertGardzinski Użytkownik (820 p.)
przywrócone 6 dni temu przez RobertGardzinski
Nie zgłębiłem się w kod, ale spróbuj przesłać dwa ostatnie argumenty w funkcji innyprogram przez referencję.

@edit: mój komentarz to bzdura, nie zawracaj sobie głowy
komentarz 6 dni temu przez Jedyn Obywatel (1,000 p.)
ok xd
komentarz 6 dni temu przez RobertGardzinski Użytkownik (820 p.)
Głupotę palnąłeś, bo nie zainicjalizowałeś tab[2]
komentarz 6 dni temu przez Jedyn Obywatel (1,000 p.)
Ajajaaj no fakt, na szybko chciałem to napisać i wyszedł kwiatek :/. Dzięki wielkie ;)

2 odpowiedzi

+1 głos
odpowiedź 6 dni temu przez mokrowski Pasjonat (21,580 p.)

1. Tablicę zainicjuj tak a nie takim... czymś co masz.. :

int tab[] = {32, 54, 9, ... 7};

2. Funkcję innyprogram może nazwij sensowniej? Jakieś policzMinMax ?

3. Ta funkcja nie powinna nic "produkować na ekran" tylko policzyć min i max.

4. Warunkiem przerwania rekurencji będzie zmniejszenie n do wartości 0.

5. Radzę wyprowadzić min i max na zewnątrz funkcji i przekazać jako wskaźniki. Czyli:

policzMinMax(int * tablica, size_t wielkosc, int * min, int * max);

6. Nigdy nie inicjuj w 1 linii 2 zmiennych (linia 25 jest wręcz patologicznym przypadkiem bo wbrew pozorom n jest typu int a nie int *)

komentarz 6 dni temu przez Jedyn Obywatel (1,000 p.)
1.Deklarując w ten sposób tablicę wywala mi błąd
n = 11;
    tab = new int[n];
    tab[] = { 1,2,3,4,32,14,23,321,52,32,55};
expected an expression

2.Funkcję nazwałem byle jak tylko wstępnie.
3.Tak rozumiem, ale chciałbym zobaczyć efekty funkcji
4.Zgadza się, po prostu kombinowałem i zapomniałem tego zmienić

5.Dałem max i min na zewnątrz, wywala błąd na operatorach (operand types are incopatible ("int*" and "int")
komentarz 6 dni temu przez mokrowski Pasjonat (21,580 p.)
edycja 6 dni temu przez mokrowski

Ad. 1. Popatrz na pkt 1. w moim przykładzie. Te: int tab[] = { ... }; to już jest deklaracja. Nie potrzebujesz tam żadnego new czy int[11]. To mała tablica i możesz ją zmieścić na stosie (nie wołaj new bo to nie ma tu sensu).

Ad 3. Jak przekażesz przez wskaźniki i będziesz ustawiał wartości w funkcji, to efekty zobaczysz poza nią :-)

Można oczywiście napisać to również z użyciem referencji ale nie wiem czy je znasz :-)

Jak naprawdę nie będziesz wiedział jak, zajrzyj. Ale nie przed własnymi próbami:

#include <iostream>
#include <limits>

void calcMinMax1(int * tablica, size_t dlugosc_tablicy, int * min, int * max) 
{
    --dlugosc_tablicy;
    int wartosc = tablica[dlugosc_tablicy];

    if(*min > wartosc)
    {
        *min = wartosc;
    }
    if(*max < wartosc)
    {
        *max = wartosc;
    }
    if(dlugosc_tablicy) calcMinMax1(tablica, dlugosc_tablicy, min, max);
}

void calcMinMax2(int * tablica, size_t dlugosc_tablicy, int &min, int &max)
{
    --dlugosc_tablicy;
    int wartosc = tablica[dlugosc_tablicy];

    min = min > wartosc ? wartosc : min;
    max = max < wartosc ? wartosc : max;

    if(dlugosc_tablicy) calcMinMax2(tablica, dlugosc_tablicy, min, max);
}

int main()
{
    int tablica[] = {234, 1, 32, 54, 9, 12, 323, 14, 90, 234, 7};
    size_t dlugosc = sizeof(tablica) / sizeof(tablica[0]);

    int min = std::numeric_limits<int>::max();
    int max = std::numeric_limits<int>::min();

    calcMinMax1(tablica, dlugosc, &min, &max);
    std::cout << "(1) " << min << ' ' << max << std::endl;

    calcMinMax2(tablica, dlugosc, min, max);
    std::cout << "(2) " << min << ' ' << max << std::endl;
}

Napisałem to prosto + kilka rzeczy które powinieneś wiedzieć :-)

0 głosów
odpowiedź 4 dni temu przez Gankkah Początkujący (420 p.)
Masz funkcję void, a zwracasz coś?

Przecież miałeś nie zwracać!
komentarz 2 dni temu przez Jedyn Obywatel (1,000 p.)
Od raz poprawiłem ale + za czujność! :D

Podobne pytania

0 głosów
1 odpowiedź 99 wizyt
pytanie zadane 14 maja 2016 w C i C++ przez Evelek Pasjonat (21,080 p.)
0 głosów
1 odpowiedź 99 wizyt
pytanie zadane 28 listopada 2015 w C i C++ przez Grzyboo Nałogowiec (28,290 p.)
0 głosów
2 odpowiedzi 73 wizyt
pytanie zadane 22 stycznia w C i C++ przez heros22pt Użytkownik (800 p.)
...