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

2 odpowiedzi

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

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

Podobne pytania

0 głosów
1 odpowiedź 58 wizyt
pytanie zadane 19 grudnia 2017 w Java przez Ohnne Nowicjusz (180 p.)
0 głosów
1 odpowiedź 153 wizyt
pytanie zadane 14 maja 2016 w C i C++ przez Evelek Nałogowiec (28,850 p.)
0 głosów
1 odpowiedź 150 wizyt
pytanie zadane 29 października 2017 w C i C++ przez foruminfa Początkujący (270 p.)
Porady nie od parady
Odznacz odpowiedź zieloną fajką, jeśli uważasz, że jest ona najlepsza ze wszystkich i umożliwiła ci rozwiązanie problemu.
Ciekawy innych porad? Odwiedź tę stronę!

45,607 zapytań

85,955 odpowiedzi

171,564 komentarzy

22,094 pasjonatów

Przeglądających: 170
Pasjonatów: 0 Gości: 170

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.

...