• 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
83 wizyt
pytanie zadane 21 kwietnia w C i C++ przez Jedyn Obywatel (1,180 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 21 kwietnia przez RobertGardzinski Obywatel (1,980 p.)
przywrócone 21 kwietnia 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 21 kwietnia przez Jedyn Obywatel (1,180 p.)
ok xd
komentarz 21 kwietnia przez RobertGardzinski Obywatel (1,980 p.)
Głupotę palnąłeś, bo nie zainicjalizowałeś tab[2]
komentarz 21 kwietnia przez Jedyn Obywatel (1,180 p.)
Ajajaaj no fakt, na szybko chciałem to napisać i wyszedł kwiatek :/. Dzięki wielkie ;)

2 odpowiedzi

+1 głos
odpowiedź 21 kwietnia przez mokrowski Nałogowiec (26,380 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 21 kwietnia przez Jedyn Obywatel (1,180 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 21 kwietnia przez mokrowski Nałogowiec (26,380 p.)
edycja 21 kwietnia 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ź 23 kwietnia przez Gankkah Użytkownik (720 p.)
Masz funkcję void, a zwracasz coś?

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

Podobne pytania

0 głosów
1 odpowiedź 106 wizyt
pytanie zadane 14 maja 2016 w C i C++ przez Evelek Nałogowiec (25,840 p.)
0 głosów
1 odpowiedź 102 wizyt
pytanie zadane 28 listopada 2015 w C i C++ przez Grzyboo Nałogowiec (28,990 p.)
0 głosów
2 odpowiedzi 81 wizyt
pytanie zadane 22 stycznia w C i C++ przez heros22pt Użytkownik (940 p.)

35,172 zapytań

71,376 odpowiedzi

136,425 komentarzy

17,049 pasjonatów

Przeglądających: 119
Pasjonatów: 4 Gości: 115

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...