Silnia w C++ - rekurencyjnie

 

Algorytm rozwiązywania równania liniowego

Schemat blokowy rekurencyjnego algorytmu obliczania silni

#include <iostream>
using namespace std;

unsigned int silnia(unsigned int n) {
   if(n>1)
    return n*silnia(n-1);
  else
    return 1;
}

int main(int argc, char *argv[]) {
   unsigned int n, wynik;
   cout<<"n = ";
   cin>>n;
   wynik=silnia(n);
   cout<<n<<"! = "<<wynik<<endl;
   char c;
   cin>>c;
}

 W pierwszej linii programu dołączamy plik nagłówkowy biblioteki iostream (strumieni wejścia-wyjścia). Jest to niezbędne, gdyż w dalszej części programu będziemy chcieli mieć możliwość pisania na ekranie (cout) i wczytywania danych wejściowych z klawiatury (cin). W 2 linii informujemy kompilator, że będziemy używali w programie nazw zdefiniowanych w przestrzeni nazw std (będą to: cincoutendl), gdybyśmy tego nie uczynili konieczne byłoby używanie dłuższego zapisu nazw kwalifikowanych (std::cinstd::coutstd::endl).

 W linii 4 deklarujemy funkcję o nazwie silnia, przyjmującą jeden parametr typu całkowitego (n) i zwracającą w wyniku liczbę całkowitą. Pomiędzy nawiasami logicznymi { z końca linii 4 i } z linii 9 zawarte jest ciało funkcji - zestaw instrukcji wykonywany przez program po wywołaniu tej funkcji.

 W linii 5 sprawdzamy czy n jest większe od 1 - blok (3) algorytmu. Jeżeli tak to w linii 6 określamy wynik funkcji jako n pomnożone przez wartość funkcji silnia (tej samej funkcji silnia, którą aktualnie definiujemy) dla n pomniejszonego o 1 (4). W tym miejscu funkcja silnia wywołuje samą siebie. Taką funkcję nazywamy funkcją rekurencyjną. Jeśli n nie jest większe od 1 to w linii 8 ustalamy wynik funkcji równy 1 (warunek zakończenia rekurencji) - blok (5).

 W języku C++ program rozpoczyna się od wykonania funkcji main. Linia 11 zawiera początek definicji funkcji main, jest to początek realizacji naszego algorytmu (blok START (1)). W kolejnej linii deklarujemy dwie zmienne typu integer (zmienne n oraz wynik).

 Linie od13 do 14 realizują operację wejścia/wyjścia (2), w której pobierane są dane wejściowe - argument funkcji silnia.

 W linii 15 zmiennej wynik przypisujemy wynik działania funkcji silnia wywołanej z argumentem n.

 W linii 16 wypisujemy otrzymany wynik (blok wejścia-wyjścia (6)).

 Instrukcje w liniach 17 - 18 nie mają żadnego związku z wykonaniem algorytmu. Służą zatrzymaniu programu do czasu wprowadzenia dowolnego znaku i naciśnięcia klawisza enter, co zapobiega natychmiastowemu zamknięciu okienka z programem.

 Nawias klamrowy } z linii 19 kończy funkcję main i zarazem działanie całego programu (blok końca algorytmu (7)).