Nyckelord: Metoder
Räkna ut fakultet i Java
I denna uppgift ska vi skapa en metod som räknar ut fakulteten av ett tal. Vi ska göra detta genom att skapa ett program som anropar en metod rekursivt.
Fakultet är en funktion inom matematiken. För ett heltal större än noll är fakulteten lika med produkten av alla heltal från 1 upp till och med talet självt.
-Wikipedia
Fakultet definieras enligt:
n! = 1 * 2 * 3 * ... * (n - 1) * n
Exempelvis:
4! = 1 * 2 * 3 * 4 = 24
För att skapa en metod som anropar sig själv rekursivt behöver vi tänka på:
- Hur beräknar vi basfallet (alltså då
n = 1)? - Hur löser vi alla andra fall än basfallet?
Utgå från följande program för att lösa uppgiften:
public class MetoderUppgift4 {
public static void main(String[] args) {
}
}
Använd en variabel n av datatypen int som input till metoden. Testa sedan olika värden på n för att se om metoden fungerar som den ska.
Ledtråd
Basfallet, då n = 1, ska vi returnera 1. I alla övriga fall kan vi skriva om definitionen för fakultet enligt:
Svar
public class MetoderUppgift4 {
public static void main(String[] args) {
// Beräkna fakulteten av n
int n = 5;
System.out.println("Fakulteten av " + n + " är: " + factorial(n));
}
// Long rymmer exakt fakulteterna för n från 0 till 20.
public static long factorial(int n) {
if (n < 0 || n > 20) throw new IllegalArgumentException("n måste vara mellan 0 och 20");
if (n <= 1) return 1L;
return n * factorial(n - 1);
}
}
Förklaring:
Först bestämmer vi basfallet, det vill säga då n = 1. Vi vet att 1! = 1, därför returnerar vi 1 i basfallet.
Fakultet kan beskrivas med uttrycket
Vi kan alltså i alla andra fall än basfallet anropa fakultet-metoden igen med inputen (n-1).
Programmet körs alltså enligt:
factorial(5)
factorial(4)
factorial(3)
factorial(2)
factorial(1)
return 1
return 2*1 = 2
return 3*2 = 6
return 4*6 = 24
return 5*24 = 120
Och så vidare beroende på vad du tilldelar för värde på n.
Även 0! = 1. Lösningen använder long och tillåter n från 0 till 20. Större fakulteter kräver exempelvis BigInteger. Ett int kan bara representera fakulteter upp till 12! utan overflow.