Rozdz. 18.3 Dydaktyczna wersja silnii "rekurencyjnej"
Ostatnio zmodyfikowano 2010-04-09 10:32
marek Temat założony przez niniejszego użytkownika |
Rozdz. 18.3 Dydaktyczna wersja silnii "rekurencyjnej" » 2010-03-13 16:26:23 Przyznam się szczerze, że jako początkujący musiałem się trochę poboksować z funkcją rekurencyjną. Zaproponowany na kursie przykład jest bardzo elegancki i krótki. Wadą jest natomiast to że nie widać jak np dla n=3 jedna funkcja wywołuje drugą: main()-->Silnia(n=3)--> Silnia(n=2))--> Silnia(n=1)-->Silnia(n=2)--> Silnia(n=3)--> main() Proponuję wyrażenie Silnia(n-1)*n zastąpić wyrażeniem n*Silnia(n-1). Dla kompilatora "wsio ryba", a dla człowieka to drugie jest bardziej jednoznaczne. Dla celów dydaktycznych wywoływanie funkcji usunąłem ze strumienia, chociaż jest to dopuszczalne. Przy okazji. Zapomniałem jak się edytuje na forum kod źródłowy żeby były kolorki. #include <conio.h> #include <iostream>
long long Silnia( long long n ); int main() { using std::cout; int n = 3, silnia; silnia = Silnia( n ); cout << "\nSilnia(" << n << ") = " << silnia; getch(); return 0; }
long long Silnia( long long n ) { using std::cout; int k; if( n <= 1 ) { cout << "n = " << n << "\n\n"; k = 1; cout << "Silnia(" << n << ") = " << k << "\n"; return k; } else { cout << "n = " << n << "\n"; k = n * Silnia( n - 1 ); cout << "Silnia(" << n << ") = " << k << "\n"; return k; } }
|
|
GoldWolf |
» 2010-04-08 11:07:09 Marek napisz do tego jakieś 2 - 3 zdania wyjaśnienia albo jakieś komentarze. Teraz nie mam czasu się tym bawić. |
|
marek Temat założony przez niniejszego użytkownika |
Jeszcze bardziej "dydaktyczna" wersja funkcji rekurencyjnej » 2010-04-09 10:32:44 Tu chyba dokładnie widać jak funkcja main wywołuje funkcję Silnia(n) i dalej jak Silnia(n) wywołuje samą siebie: #include <conio.h> #include <iostream>
long long Silnia( long long n ); int main() { using std::cout; int n = 3, silnia; silnia = Silnia( n ); cout << "\nSilnia (" << n << ") = " << silnia; getch(); return 0; }
long long Silnia( long long n ) { using std::cout; int k; cout << "wejsce do funkcji dla n = " << n << "\n"; if( n <= 1 ) { k = 1; cout << "return k = " << k << "\n"; return k; } else { k = n * Silnia( n - 1 ); cout << "return k = " << k << "\n"; return k; } }
Po pozbyciu się komentarzy i pośrednich wydruków, czyli całej otoczki dydaktycznej, program będzie oczywiście krótszy: #include <conio.h> #include <iostream>
long long Silnia( long long n ); int main() { using std::cout; int n = 3, silnia; cout << "Silnia (" << n << ") = " << Silnia( n ); getch(); return 0; } long long Silnia( long long n ) { using std::cout; int k; if( n <= 1 ) { k = 1; return k; } else { k = n * Silnia( n - 1 ); return k; } }
Przy okazji warto zmienić komentarz z pierwszej linijki na taki jaki jest w moim przykładzie. Komentarz: //Odliczanie inne spojrzenie przykład z kursu 8.2 |
nie powinien mieć odniesienia do p. 8.2 ani do odliczania Dante: Wprowadzono |
|
« 1 » |