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!
//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));
}
}
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(); } }