Silnia rekurencyjnie

Rekurencja to wywołanie z poziomu metody jej samej. Chcemy napisać metodę, która policzy wartość silni dla liczby przekazanej jako parametr. Wykorzystamy wywołania rekurencyjne.
// wykorzystujemy klasę Scanner z pakietu java.util
import java.util.*;

/**
 * Rekurencyjne liczenie silni
 * @author kodatnik.blogspot.com 
 */ 
public class Silnia {
 
 // metoda silnia zwraca silnię z liczby przekazanej jako parametr
 // obliczenie silni odbywa się za pomocą rekurencji
 public static int silnia(int wartosc) {
  // jeśli przekazany parametr jest równy zero to zwróć 1
  // a w przeciwnym wypadku zwróć wartość parametru * wywołanie metody silnia
  // z parametrem o jeden mniejszym
  if(wartosc == 0) return 1;
  else return wartosc * silnia(wartosc - 1);
 }

 public static void main(String[] args){
  
  Scanner sc = new Scanner(System.in);
  System.out.print ("Podaj liczbę: " );
  
  // pobieramy od użytkownika liczbę
  int liczba = sc.nextInt();
  
  // wyświetlamy na ekranie obliczoną silnię
  System.out.println(liczba + "! = " + silnia(liczba));
 
 }
}
Podając na wejściu liczbę 5 wywołamy metodę silnia z wartością pięć. Metoda zwróci nam wartość parametru razy ponowne wywołanie metody silnia z parametrem o 1 mniejszym itd. Czyli przebieg działania metody będzie wyglądał tak jak poniżej:
silnia(5)
   |
   5 * silnia(4)
          |
          4 * silnia(3)
                 |
                 3 * silnia(2)
                        |
                        2 * silnia(1)
                               |
                               1 * silnia(0)
                                      |
                                      1
 
Razem dostaniemy: 5*4*3*2*1*1 = 120
Przykładowe uruchomienie aplikacji:
Podaj liczbę: 5
5! = 120
Wywołania rekurencyjne są bardzo pamięciożerne. Pisząc aplikację dobrze jest zastanowić się czy wywołania iteracyjne nie będą bardziej efektywne. Istotny jest również warunek stopu (kończący wywołania rekurencyjne), bez niego rekurencja może prowadzić do zawieszenia się programu (błędy związane z przepełnieniem stosu - Stack Overflow).


0 Komentarzy - Silnia rekurencyjnie

Prześlij komentarz

Możesz użyć niektórych tagów HTML, takich jak <b>, <i>, <u>, <a> Nie spamuj :)

Popularne posty