Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Zadanie z rekurencji

Ostatnio zmodyfikowano 2015-01-14 20:00
Autor Wiadomość
Malina94
Temat założony przez niniejszego użytkownika
Zadanie z rekurencji
» 2015-01-14 16:57:54
Witam! Czy byłby ktoś wstanie rozpisać mi dojście do wybranego rozwiązania? Niestety rekurencja sprawia mi problemy, a bardzo  zależy mi na tym by to zrozumieć. Ogólnie chodzi tu o to, aby podać co zostanie wypisane na wyjście. Poniżej zamieszczam kod razem z odpowiedziami do poszczególnych linijek.


C/C++
#include <stdio.h>
int zagadka( int x ) {
    if( x <= 0 )
         return 1;
   
    return zagadka( x / 2 ) + zagadka(( x - 1 ) % 3 );
}

int main() {
    printf( "%d", zagadka( 1 ) ); //odp: 2
    printf( "%d", zagadka( 2 ) ); //odp: 4
    printf( "%d", zagadka( 4 ) ); //odp: 5
    printf( "%d", zagadka( 9 ) ); //odp: 9
   
}
P-124908
Chlorek
» 2015-01-14 17:05:19
Może się nie znam, ale nie widzę innego dojścia niż po prostu liczenie tego, w pamięci będzie trochę ciężko z całą pewnością.. gdyż każdy return dwukrotnie wykonuje rekurencję. Nie ma chyba jakiegoś sposobu na to.
P-124909
Malina94
Temat założony przez niniejszego użytkownika
» 2015-01-14 17:59:45
No w pamięci trzeba. To jest jedno z zadań egzaminacyjnych z poprzednich lat z mojej uczelni.
A ewentualnie coś takiego?

Polecenie:
Jaki napis pojawi się na ekranie w wyniku wywołania: pisz("uwaga:wskazniki!!!");
C/C++
#include <stdio.h>

void pisz( char * s ) {
    if( * s == '!' )
         return;
   
    if( * s != *( s + 7 ) )
         pisz( s + 2 );
   
    printf( "%c", s[ 3 ] ); //odpowiedź: :g
}

Doszłam do wypisania dwukropka, a potem się gubię.

Moje rozumowanie:
Pierwsze wywołanie: s = 0, s+7 = 7
Są to litery "u" i "s", są różne, więc wywołuję funkcję pisz dla s = 2.
Drugie wywołanie: s = 2, s+7 = 9
Są to litery "a" i "a", a więc są takie same. Nie wywołuję funkcji pisz ponownie. Wypisuję printfem s[3], czyli względem s = 2 jest to element nr 5, czyli ":".
P-124919
Chlorek
» 2015-01-14 18:03:55
Jestem raczej ścisłym umysłem, ale do tego to kartka by mi była potrzebna. Tak czysto w pamięci się nie da. Nie ma tu innej prawidłowości jak po prostu "wykonać program manualnie".
P-124921
Malina94
Temat założony przez niniejszego użytkownika
» 2015-01-14 18:15:09
Wiem, też to robię... rozpisuję na kartce i o to chodzi w tych zadaniach. Ale mimo tego nie potrafię dojść do prawidłowego rozwiązania, dlatego proszę o pomoc na forum.
P-124923
michal11
» 2015-01-14 18:38:53
Dodaj sobie jakieś dodatkowe, tymczasowe printowanie różnych zmiennych w jakiś przejrzysty sposób i wtedy będziesz mniej więcej widziała ci się dzieje krok po kroku.
P-124925
bnk120
» 2015-01-14 18:54:51

Moje rozumowanie:
Pierwsze wywołanie: s = 0, s+7 = 7
Są to litery "u" i "s", są różne, więc wywołuję funkcję pisz dla s = 2.
Drugie wywołanie: s = 2, s+7 = 9
Są to litery "a" i "a", a więc są takie same. Nie wywołuję funkcji pisz ponownie. Wypisuję printfem s[3], czyli względem s = 2 jest to element nr 5, czyli ":".

No dobra, powiedzmy, że jest ok.

Zauważ, że po tej części kodu :

if( * s != *( s + 7 ) )
         pisz( s + 2 );

jest jeszcze ten printf,

printf( "%c", s[ 3 ] ); //odpowiedź: :g
który wypisuje literkę "g".

P-124928
Malina94
Temat założony przez niniejszego użytkownika
» 2015-01-14 19:04:15
No tak. Ale powyższy zapis jest równoważny z takim:
C/C++
if( * s != *( s + 7 ) ) {
    pisz( s + 2 );
}
printf( "%c", s[ 3 ] );
Tzn. pisz jest w klamerce, a printf poza. Jak wyszłam z ifa i dotarłam do printfa, to jak jeszcze raz do niego dochodzę by wypisać to "g"? Muszę jeszcze się cofnąć po tych wszystkich krokach, które wykonałam po pierwszym wejściu w if?
P-124929
« 1 » 2
  Strona 1 z 2 Następna strona