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. #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 ) ); printf( "%d", zagadka( 2 ) ); printf( "%d", zagadka( 4 ) ); printf( "%d", zagadka( 9 ) ); }
|
|
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. |
|
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!!!"); #include <stdio.h>
void pisz( char * s ) { if( * s == '!' ) return; if( * s != *( s + 7 ) ) pisz( s + 2 ); printf( "%c", s[ 3 ] ); }
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 ":". |
|
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". |
|
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. |
|
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. |
|
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". |
|
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: 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? |
|
« 1 » 2 |