Silnia w javie - rekurencyjnie

Algorytm rozwiązywania równania liniowego

Schemat blokowy rekurencyjnego algorytmu obliczania silni

import java.util.Scanner;
public class Sil_rek {
  public static void main(String[] args) {
    int n;
    Scanner klaw=new Scanner(System.in);
    System.out.print("n = ");
    n=klaw.nextInt();
    int wynik=silnia(n);
    System.out.print(n);
    System.out.print("! = ");
    System.out.println(wynik);
  }
  
  static int silnia(int n){
    if(n>1)
      return n*silnia(n-1);
    else
      return 1;    
  }
}

    W pierwszej linii programu informujemy, że będziemy korzystali z klasy Scanner z biblioteki util javy. Klasa Scanner zostanie użyta do wczytywania danych wejściowych w naszym programie. W języku java wykonywanie programu rozpoczyna się od wywołania publicznej funkcji statycznej main() zawartej w klasie, której nazwa jest zgodna z nazwą programu (program musi zostać zapisany w pliku Sil_rek.java i następnie skompilowany do pliku Sil_rek.class). Definicja klasy Sil_rek rozpoczyna się w 3 linii programu. Linia 4 zawiera początek definicji funkcji main, jest to początek realizacji naszego algorytmu (blok START (1)). W kolejnej linii deklarujemy zmienną n typu integer, której za chwilę użyjemy do wczytania z klawiatury argumengtu funkcji silnia. W javie zmienne można deklarować w dowolnym miejscu przed ich użyciem, dlatego nie deklarujemy tutaj od razu zmiennej wynik. W 6 linii deklarujemy i inicjujemy zmienną klaw jako obiekt typu Scanner. Podajemy, że źródłem danych tekstowych będzie strumień System.in, czyli klawiatura.

  Linie od 7 i 8 realizują operację wejścia/wyjścia (2), w której pobierane są dane wejściowe - n, liczba, dla której chcemy obliczyć wartość funkcji silnia.

 W linii 9 deklarujemy zmienną wynik i przypisujemy do niej wynik działania funkcji silnia wywołanej z argumentem n.

 W liniach 10 do 11 wypisujemy otrzymany wynik (blok wejścia-wyjścia (6)).

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

 W linii 15 deklarujemy funkcję silnia, którą użyliśmy w funkcji main. Funkcja będąca metodą tej samej klasy nie musi zostać zadeklarowana wcześniej, przed użyciem. Funkcja silnia przyjmuje jeden argument typu całkowitego (n) i zwraca w wyniku liczbę całkowitą. omiędzy nawiasami logicznymi { z końca linii 15 i } z linii 20 zawarte jest ciało funkcji - zestaw instrukcji wykonywany przez program po wywołaniu tej funkcji.

  W linii 16 sprawdzamy czy n jest większe od 1 - blok (3) algorytmu. Jeżeli tak to w linii 17 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 19 ustalamy wynik funkcji równy 1 (warunek zakończenia rekurencji) - blok (5).

 Nawias klamrowy } z linii 20 kończy funkcję silnia, natomiast nawias klamrowy w linii 22 kończy definicję klasy Sil_rek.