Rekursive Methode für Fakultät mit BigInteger

Krösus

Mitglied
Servus,
wir sollen eine rekursive Methode schreiben, um die Fakultät einer Zahl zu berechnen mit BigInteger. Ich bin eigentlich der festen Überzeugung, dass mein Code stimmt und er funktionieren müsste. Selbst der Compiler ist zufrieden.

Java:
import java.math.BigInteger;

public class BigInt {
    static BigInteger facRek(BigInteger n) {
       
        //int compare;
        //compare = n.compareTo(BigInteger.ZERO);
        //System.out.println(compare);
       
        if (n.compareTo(BigInteger.ZERO) == 0) {
            return BigInteger.ZERO;
        } else {
           
            return n.multiply(facRek(n.subtract(BigInteger.ONE)));
        }
    }
    public static void main(String[] args) {
        BigInteger fac = new BigInteger("5");
        System.out.print(facRek(fac));
    }
}

Die 5 wird richtig an die Methode übergeben und wird auch korrekt runtergezählt. Es bedeutet also, dass auch " return n.multiply(facRek(n.subtract(BigInteger.ONE))); " prinzipiell funktioniert, nur gibt er kein Ergebnis aus, sondern immer nur die 0, wenn er fertig ist.
 
Java:
static BigInteger facRek(BigInteger n) {

    //int compare;
    //compare = n.compareTo(BigInteger.ZERO);
    //System.out.println(compare);

    if (n.compareTo(BigInteger.ZERO) == 0) {
        return BigInteger.ONE;
    } else {

        return n.multiply(facRek(n.subtract(BigInteger.ONE)));
    }
}
.ONE sonst wird alles mit 0 multipliziert fak von 0 ist als eins definiert!
 
Da hast du dein Eis:
Java:
    public static void main(String[] args) {
        IntStream.range(0, 7).mapToObj(i -> i + ": " + facRek(BigInteger.valueOf(i))).forEach(System.out::println);
    }

    public static BigInteger facRek(BigInteger n) {
        if (n.compareTo(BigInteger.ONE) == 0) {
            return BigInteger.ONE;
        }
        if (n.compareTo(BigInteger.ZERO) == 0) {
            return BigInteger.ONE;
        }
            return n.multiply(facRek(n.subtract(BigInteger.ONE)));
    }

Code:
0: 1
1: 1
2: 2
3: 6
4: 24
5: 120
6: 720

IMO stimmt es so (kann aber noch verbessert werden).

Bearbeitung: Verdächtig: http://stackoverflow.com/questions/8992437/stackoverflowerror-computing-factorial-of-a-biginteger
 
Java:
static BigInteger facRek(BigInteger n) {

    //int compare;
    //compare = n.compareTo(BigInteger.ZERO);
    //System.out.println(compare);

    if (n.compareTo(BigInteger.ZERO) == 0) {
        return BigInteger.ONE;
    } else {

        return n.multiply(facRek(n.subtract(BigInteger.ONE)));
    }
}
.ONE sonst wird alles mit 0 multipliziert fak von 0 ist als eins definiert!

Natürlich 🙄
Vielen Dank an alle es funktioniert jetzt einwandfrei 🙂
 
BTW: Kann man das nicht umschreiben, dass int übergeben wird - und BigInteger Rückgabetypwert ist?
 
Java:
public static BigInteger facRek(BigInteger n) {
        return n.equals(BigInteger.ONE)|| n.equals(BigInteger.ZERO) ? 
                BigInteger.ONE:
                    n.multiply(facRek(n.subtract(BigInteger.ONE)));
    }
 

Zurück
Oben