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

Obliczanie wartości parametru domyślnego na podstawie innego parametru.

Object Storage Arubacloud
0 głosów
343 wizyt
pytanie zadane 12 kwietnia 2017 w C i C++ przez Sinnley Stary wyjadacz (12,810 p.)
edycja 12 kwietnia 2017 przez Sinnley

Chciałem napisać rekurencyjna funkcje odwracajaca tablice. Zamysł mam taki że wywołanie będzie zamieniać na wskazanych pozycjach, po czym wywoływać samemu siebie z początkiem i końcem odpowiednio zwiększonymi i zmniejszonymi o 1.

Chcialem jednak aby domyślnie parametrami początku i końca były indeksy początku i końca tablicy. Czy jest możliwe zrobienie tego bez pomocniczej funkcji?

Próbowałem w ten sposób

int* zamień (int tablica [],int początek=0, int koniec=sizeof(tablica)/sizeof(tablica[0]) -1)

Ale kod nie działa.

2 odpowiedzi

+1 głos
odpowiedź 13 kwietnia 2017 przez Ehlert Ekspert (212,670 p.)
edycja 13 kwietnia 2017 przez Ehlert

Zwykłe odwrócenie tablicy i chcesz do tego rekurencję? To nie jest dobry pomysł. Znaczy działać jak najbardziej będzie. Najczęściej jednak rekurencji tam gdzie można, unika się. 

Zrób zwykłego fora od początku do połowy tablicy. Dwa iteratory. Jeden od początku, drugi od końca i zamieniaj. 

A tak na poważnie to nie baw się w takie rzeczy. Jeśli rozumiesz algorytm to daj sobie spokój i korzystaj z std::reverse. 

komentarz 13 kwietnia 2017 przez Sinnley Stary wyjadacz (12,810 p.)
Robie zadania z książki o algorytmach.
komentarz 13 kwietnia 2017 przez criss Mędrzec (172,590 p.)
@Ehlert Zamiast "referencję" miało być "rekurencję"?
komentarz 13 kwietnia 2017 przez Ehlert Ekspert (212,670 p.)

Za późna godzina była i nie widziałem już różnicy crying

0 głosów
odpowiedź 13 kwietnia 2017 przez mokrowski Mędrzec (155,460 p.)

Tylko w niektórych branżach masz zabronione stosowanie rekurencji. Warto się jej nauczyć bo np. metaprogramowanie w C++ na niej bazuje. Przykładzie będziesz miał rekurencję ogonową i nie będzie przeciążenia stosu w większości szanujących się kompilatorów.

#include <iostream>

void recurRev(char * first, char * last) {
    if(first >= last) {
        return;
    }
    char tmp = *first;
    *first = *last;
    *last = tmp;
    return recurRev(++first, --last);
}

int main() {
    char msg[] = "Ala ma kota";
    recurRev(msg, msg + sizeof(msg) - 2);
    std::cout << msg << std::endl;
}

 

komentarz 13 kwietnia 2017 przez Sinnley Stary wyjadacz (12,810 p.)
Takim algorytmem sam próbowałem to zrobić. Chodzi mi głównie o to jak zrobić ją tak, by do funkcji można było przekazać samą tablicę, a reszta parametrów będzie domyślna. Tego dotyczyło pytanie.
komentarz 13 kwietnia 2017 przez mokrowski Mędrzec (155,460 p.)

No to przemyśl pytanie bo tu nie ma sensu stosowanie parametrów domyślnych. Do czego? Przy każdym wywołaniu parametry są inne (zmienia się początek i koniec wartości do zamiany) i w dodatku jeśli chcesz uniknąć przepełnienia stosu, powinieneś stosować je w samym wywołaniu by była to rekurencja ogonowa.

Jeśli chcesz wywołać funkcję wygodniej, przekaż kontener i zrób to przez funkcję pomocniczą. Ten przykład tego nie wymaga, ale zmodyfikuję go dla celów edukacyjnych:

#include <iostream>

static void recurRev_(int * first, int * last) {
    if(first >= last) {
        return;
    }
    // Tu można użyć po prostu std::swap
    int tmp = *first;
    *first = *last;
    *last = tmp;
    return recurRev_(++first, --last);
}

void recurRev(int * table, size_t length) {
    // Aby mieć wskaźnik na ostatni element..
    recurRev_(table, table + length - 1);
}

int main() {
    int data[] = {1, 2, 3, 4, 8};
    // Przekazanie tak naprawdę długości kontenera
    recurRev(data, sizeof(data) / sizeof(data[0]));
    for(const auto& v: data) {
        std::cout << v << " ";
    }
    std::cout << '\n';
}

Jeśli zaś pytasz o domyślną długość tablicy aby ją przekazać, to niestety ale rozczaruję Cię. Długość tablicy jest gubiona bo w momencie przekazania argumentu przez wskaźnik ,nikt i nic nie wie że to tablica i o odpowiedniej długości. Odsyłam do wiedzy o argumentach typu tablica w funkcjach. Albo wpiszesz tam explicite wielkość tablicy, albo przekażesz wskaźnik i wielkość tablicy.

Jeszcze raz.. po co Ci te argumenty domyślne przy przekazaniu kontenera w tym zastosowaniu rekurencji?

komentarz 13 kwietnia 2017 przez Sinnley Stary wyjadacz (12,810 p.)

Dlatego, że jak widzisz u góry moja lista parametrów jest inna niż twoja. Nie przekazywałem tablicy jako wskaźnik, tylko jako tablicę właśnie. A drugi i trzeci argument miały być intami oznaczającymi odpowiednio domyślnie początek i koniec tablicy, ale wywołania rekurencyjne nie korzystały by już z ich domyślnych wartości. 

Krótko mówiąc, zależało mi żebym mógł tę funkcje wywołać tak:

int tablica[5] = {1,2,3,4,5};

int tablicaodw[5] = odwroc(tablica);

Gdzie jej liste parametrów masz w pytaniu. Kolejne wywołania rekurencyjne funkcji wyglądały by tak:


return odwroc(tablica, poczatek+1, koniec-1);

 

Podobne pytania

0 głosów
0 odpowiedzi 294 wizyt
0 głosów
0 odpowiedzi 770 wizyt
+1 głos
1 odpowiedź 252 wizyt

92,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,958 pasjonatów

Motyw:

Akcja Pajacyk

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

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...