Jak obliczyć silnie? – Java

Dzisiaj kolejny z kilku wpisów czekających na akceptacje przeniesionych z bloga (2012 rok). Jeśli zastanawiasz się jak obliczyć silnie w Javie (gotowy kod źródłowy funkcji) to dobrze trafiłeś! Jedna funkcja silny Java (factorial in java) została została zaimplementowana  za pomocą iteracji w pętli for, druga natomiast rekurencyjnie. Obie funkcje przyjmują parametr n. Dla osób programujących w językach C pochodnych, przepisanie tej funkcji nie sprawi żadnego problemu. Które lepsze rozwiązanie? Sami zadecydujcie. Nie będę się rozwodził czym jest silnia, od razu przejdę do rozwiązania problemu.

Jak obliczyć silnie – rozwiązanie iteracyjnie:

public static int silnia (int n) {
    int iloczyn = 1;
    for (int i=1; i<=n; i++) {
        iloczyn *= i;
    }
    return iloczyn;
}

Java, silnia – rozwiązanie rekurencyjne:

public static int silnia_rekurencyjna (int n) {
    if (n==0)
        return 1;
    else
        return (n*silnia_rekurencyjna(n-1));
}

Które rozwiązanie lepsze? Jak się okazuje rekurencyjne choć w naturalny sposób czytelniejsze dla programisty jest wolniejsze. Wiąże się to z przekazywaniem parametrów poprzez stos i pamiętaniem ich w tzn kontekście w pamięci. Upraszczając, żeby obliczyć silnie rekurencyjnie musimy przejść przez wszystkie wywołania dla różnych wartości by obliczyć końcowy iloczyn czyli silnie. Wystarczy spojrzeć na czasy i wywołania w NetBeans dla parametru n=25… O ile potraficie używać profilera :-). Pozdrawiamy!

2 thoughts to “Jak obliczyć silnie? – Java”

  1. //silnia metodą iteracji
    public class Silnia {
    public static int silnia(int n) {
    int iloczyn = 1;
    for(int i = 1; i <= n; i++) {
    iloczyn *= i;
    }
    return iloczyn;
    }
    public static void main(String[] args) {
    System.out.println(silnia(0));
    System.out.println(silnia(1));
    System.out.println(silnia(2));
    System.out.println(silnia(3));
    System.out.println(silnia(4));
    System.out.println(silnia(5));
    }
    }

  2. import java.util.Scanner;public class InputToFactorial { public static void main(String[] args) { System.out.println("This app counts factorial from given number."); System.out.println("Input value: "); long value = getInt(); long product; long factorial; long multiplier = value - 1; main_loop: while(value > 0){ product = multiplier * value; factorial = product * multiplier; value = product; multiplier--; if(multiplier == 0){ System.out.println("Factorial from given number equals: "+factorial); break main_loop; } } if(value == 0){ factorial = 1; System.out.println("Factorial from given number equals: "+factorial); } } public static long getInt() { return new Scanner(System.in).nextInt(); } }

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *