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

Rekurencja tablice

Object Storage Arubacloud
0 głosów
774 wizyt
pytanie zadane 2 października 2020 w C i C++ przez madbull Początkujący (270 p.)
Napisz funkcję rekurencyjną pobierającą tablicę i wyświetlającą jej elementy w odwrotnej
kolejności, która jednak nie zaczyna swojej pracy od ostatniego elementu tablicy (innymi
słowy, nie pisz ekwiwalentu pętli rozpoczynającej wyświetlanie od końca tablicy).

Mój problem polega na tym, że nie wiem jak napisać funkcje rekurencyjna która pobierze mi wartości z tablicy i następnie ją odwróci. Potrafie pobrac wartosci z tablicy do funkcji i potem odwrocic wartosci w tablicy, ale potem mam wrazenie ze nie jest to rekurencja. Czy ktoś mnie nakieruję?, nie oczekuje gotowca.

2 odpowiedzi

0 głosów
odpowiedź 2 października 2020 przez tangarr Mędrzec (154,780 p.)

Czym charakteryzuje się funkcja rekurencyjna?
1. Funkcja rekurencyjna wywołuje samą siebie
2. Funkcja rekurencyjna posiada warunek stopu

void funkcja_rekurencyjna(parametry) {
    if (warunek_stopu)
        return;
    funkcja_rekurencyjna(nowe_parametry);
}

Teraz zadaj sobie pytania:
1. Jakie argumenty przyjmuje twoja funkcja?
2. Co ma robić?
3. Jaki jest warunek stopu?
4. Jakie argumenty przekazać do następnego wywołania?

Jeżeli ciągle nie będziesz mógł znaleźć rozwiązania to pokaż co do tej pory wymyśliłeś.

komentarz 2 października 2020 przez madbull Początkujący (270 p.)
#include <iostream>

using namespace std;

int funkcja( int tablica[], int i = 0 )
{

    if( i == 4 )

    else
    {
        
    }

}

int main()
{
    int tablica[ 5 ];
    for( int i = 0; i < 5; i++ )
    {
        cout << "wartośc " << i << " elementu to " << endl;
        cin >> tablica[ i ];
    }
    cout << funkcja( tablica ) << endl;
    
}
komentarz 2 października 2020 przez tangarr Mędrzec (154,780 p.)

Do wstawiania kodu zawsze używaj bloczek kodu (patrz regulamin forum).

Gdybyś próbował dokończyć swój program w ten sposób to wyświetliłbyś tylko jedną wartość.

Spróbuj uzupełnić ten szablon

#include <iostream>

using namespace std;

void funkcja(int tablica[], int rozmiar)
{
    if (WARUNEK STOPU)
        return;
    WYKONAJ ITERACJĘ/ZADANIE
    funkcja(ARGUMENTY KOLEJNEJ ITERACJI)
}

int main()
{
    int tablica[5] = {1,2,3,4,5};
    int dlugosc_tablicy = sizeof(tablica)/sizeof(tablica[0]);
    funkcja(tablica, dlugosc_tablicy);
}

Odpowiedz na 3 pytania które wcześniej zadałem a zrozumiesz jak należy dokończyć ten program.

komentarz 3 października 2020 przez madbull Początkujący (270 p.)
Nie rozumiem po co tutaj funkcja size of, autor ksiazki ktora przerabiam, jeszcze nie poruszyl tego zagadnienia.
komentarz 3 października 2020 przez tangarr Mędrzec (154,780 p.)
Użyłem sizeof do obliczenia długości tablicy. To nie jest aż tak istotne w tym momencie. Równie dobrze zamiast obliczeń można wstawić wartość 5.
komentarz 4 października 2020 przez madbull Początkujący (270 p.)
#include <iostream>

using namespace std;

void funkcja(int tablica[], int rozmiar)
{
    for( int i=0; i<rozmiar; i++)
    {
        cout<<tablica[i];
    }
    if(rozmiar<5)
    {
        funkcja(tablica+1,rozmiar);

    }
    for( int i=0; i<rozmiar; i++)
    {
        cout<<tablica[i];
    }
}

int main()
{
    int tablica[5] = {1,2,3,4,5};
    int dlugosc_tablicy = sizeof(tablica)/sizeof(tablica[0]);
    funkcja(tablica, dlugosc_tablicy);
}

 

komentarz 4 października 2020 przez madbull Początkujący (270 p.)
Dalej nie chca sie pokazac wartosci w odwrotnej kolejnosci, problem jest ze wstawiam rozmiar<5 mam wrazenie ale dalej nie moge wpasc jak to zrobic .
komentarz 4 października 2020 przez madbull Początkujący (270 p.)
Twojego szablonu niestety nie rozumiem
komentarz 4 października 2020 przez tangarr Mędrzec (154,780 p.)

Dlaczego używasz pętli? Twoim zadaniem jest napisać funkcję rekurencyjną.

Spójrz na przykład rekurencyjnej funkcji obliczającej silnię

int silnia(int n) {
    if (n<=1) // warunek stopu
        return 1;
    // w przeciwnym wypadku
    return n * silnia(n-1);
}

Rekurencyjna funkcja wyświetlająca napis znak po znaku
 

void wyswietl(const char *napis) {
    if (napis[0] == 0) // warunek stopu, kończymy gdy napotkamy znak końca napisu
        return;
    std::cout << napis[0] << std::endl;
    wyswietl(napis+1); // do następnej iteracji przekazujemy napis bez pierwszego znaku
}

 

komentarz 4 października 2020 przez madbull Początkujący (270 p.)

@tangarr,

#include <iostream>

using namespace std;
void funkcja(int* tab, int indeks)
{
	cout << tab[indeks] << endl;
	if(indeks>0)
	{
    funkcja(tab,indeks-1);
	}

}
int main()
{

	int  tab[] = {1,2,3,4,5};
	funkcja(tab, 4);
}

 

0 głosów
odpowiedź 2 października 2020 przez TOM_CPP Pasjonat (22,640 p.)

W C++17 można to zrobić w następujący sposób:

#include <iostream>
#include <array>

using std::cout;
using std::array;

void print( const auto& data )
{
    static auto iter {data.cbegin()};
    auto iter_local {iter};
    if( iter++ == data.cend() ) return;
    print( data );
    cout << *iter_local << ' ';
}

int main()
{  
    print( array{1,2,3,4,5,6,7,7,7,7} );

    return 0;
}

Na tym przykładzie możesz zobaczyć jaka powinna wyglądać struktura funkcji rekurencyjnej. W Twoim przypadku będziesz musiał pozbyć się zmiennej statycznej na rzecz dodatkowego argumentu funkcji, oraz przy zamianie std::array na zwykłą tablicę podać jej wielkość (jako następny dodatkowy argument).

Podobne pytania

+1 głos
1 odpowiedź 536 wizyt
pytanie zadane 18 stycznia 2021 w Python przez szylvvia Początkujący (300 p.)
0 głosów
1 odpowiedź 1,218 wizyt
pytanie zadane 11 listopada 2017 w C# przez ewa97 Nowicjusz (170 p.)
+1 głos
0 odpowiedzi 1,386 wizyt
pytanie zadane 4 listopada 2017 w C# przez ewa97 Nowicjusz (170 p.)

92,549 zapytań

141,391 odpowiedzi

319,513 komentarzy

61,933 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!

...