| Silnia - rekurencyjny algorytm |
Rekurencję poznaje się tak naprawdę już w szkole średniej podczas liczenia silniej. Niestety ten sposób liczenia dla człowieka jest raczej uciążliwy, ale za to dla komputera wręcz idealny. W kodzie napisanym przez Sundaya możemy spotkać wywołującą się samą funkcję dzięki której liczymy wartość silniej. Jak zwykle oddaje głos specjaliście od kodowania, który tym razem przygotował wstęp teoretyczny. Sunday, do dzieła! Procek Silnia... Na matematyce poznaje się ją przy kombinatoryce, a na informatyce przy algorytmice. Silnia - to funkcja oznaczana symbolem "!" i definiowana jako: n!=1*2*3*4*...(n-2)*(n-1)*n dla n>0 i 0!=1 Rekurencyjny wzór silniej0!=1; n!=(n-1)!*n dla n>0 Myślę że każdy rozumie te wzory(jak nie to polecam powrót do liceum). W informatyce silnię z reguły obliczmy za pomocą drugiego ze wzorów - wzoru rekurencyjnego, jest to szybsze, wydajniejsze i łatwiejsze w implemtentacji. Oto funkcje liczące silnię z podanej liczby, będące bezpośrednim "tłumaczeniem" języka matematyki na język programowania. Prezentacja algorytmu na przykładzie języka C++unsigned Silnia(unsigned liczba) //To jest funkcja o nazwie Silnia, ma pobierać argument "liczba" który jest liczbą naturalną, i zwracać wartość która też jest liczbą naturalną { if(liczba==0){return 1;} //Jeżeli liczymy silnię 0 to jest to 1 (Z definicji rekurencyjnej silni 0!=1) else return Silnia(liczba-1)*liczba; //Jeżeli nie liczymy slini 0 to policzymy silnię dla argumentu mniejszego o 1 od obecnego i pomnożymy go przez obecny argument(Z definicji rekurencyjnej silni n!=(n-1)!*n) } Implementacja w języku Pascalfunction Silnia(liczba:word):word; //To jest funkcja o nazwie Silnia, ma pobierać argument 'liczba' który jest liczbą naturalną, i zwracać wartość która też jest liczbą naturalną begin if liczba=0 then Silnia:=1 //Jeżeli liczymy silnię 0 to jest to 1(Z definicji rekurencyjnej silni 0!=1) else Silnia:=Silnia(liczba-1)*liczba; //Jeżeli nie liczymy slini 0 to policzymy silnię dla argumentu mniejszego o 1 od obecnego i pomnożymy go przez obecny argument(Z definicji rekurencyjnej silni n!=(n-1)!*n) end; Sunday
|
Prowadzącym ten blog jest od 6 lat Krzysztof "Procek" Ścira - Obecnie student AGH. Blog traktujący o szeroko pojętej IT - można tu poczytać o zagadnieniach związanych z m. in. programowaniem, grafiką, hardware i systemami operacyjnymi. Warto dodać kanał RSS tego bloga do swojego czytnika.[Więcej]