ÖVNINGSUPPGIFT

Uppgift 4 - Fakultet

Försök själv först. Ledtrådar och facit finns längre ner – helt utan inloggning.


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:

Formel för att räkna ut fakulteten
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

Formel för att räkna ut fakulteten

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.

Tillbaka till översikt

Ä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.