[Dodatkowe matariały] Funkcje kolejne aspekty
Ostatnio zmodyfikowano 2015-01-10 13:02
PCS Temat założony przez niniejszego użytkownika |
[Dodatkowe matariały] Funkcje kolejne aspekty » 2015-01-09 21:57:35 Witam, mam problem z interpretacją pewnego kodu z tej lekcji, mianowicie: #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; } }
Mój problem polega na tym, iż nie mogę zrozumieć co się dzieje, gdy wejdziemy w warunek if i zwracamy zmienną k - dalej już nie pojmuję co się dzieje. Z tego kodu wynika, że 'k' z warunku if zwracamy do tego skrawka kodu? k = n * Silnia( n - 1 ); Dzięki z góry za odpowiedź. |
|
Fireho |
» 2015-01-09 23:21:55 Silnia to coś takiego, że 1! to 1, 2! to 1*2 = 2, 3! to 1*2*3 = 6, 4! to 1*2*3*4 = 24, 5! to 1*2*3*4*5=120 itd..
Ta funkcja działa tak: - dostaje jakąś wartość, np. 5 - jeśli dostanie 1 lub mniejszą, zwraca 1(bo przecież 1! to 1) - jeśli nie, zwraca aktualną wartość pomnożoną przez silnię z wartości mniejszej o 1 od obecnej - czyli wywołuje samą siebie z wartością mniejszą o 1 I tak to się powtarza, dopóki wartość nie zostanie zredukowana do 1. I wtedy się zacznie: ostatnie wywołanie zwróci 1, to przed nim obliczy 2*1 i zwróci 2, to jeszcze przed nim obliczy 3*2 i zwróci 6, to jeszcze przed nim obliczy 4*6 i zwróci 24, a funkcja wywołana na początku obliczy 5*24 i zwróci 120.
Na tym polega rekurencja - odwoływanie się do samego siebie. |
|
PCS Temat założony przez niniejszego użytkownika |
» 2015-01-10 13:02:04 Dzięki wielkie, teraz wszystko jasne. |
|
« 1 » |