2016-04-15 6 views
1

Ich versuche, die Lucas-Serie in Code mit Rekursion und die BigInteger Klasse, aber ich habe Probleme beim Einstellen der Basis Fällen. Dieser Code gibt korrekt die Fibonacci-Sequenz aus, aber alles, was ich versucht habe, um die Startwerte N (0) und N (1) zu 2 bzw. 1 zu erhalten, ist vollständig gescheitert. Ich habe Hilfe-Dateien durchsucht, aber nichts, was ich gefunden habe, hat es mit BigIntegers getan, die ich brauche, da ich plane, weit über das int Limit zu gehen.Erstellen der Lucas-Serie mit BigInteger in Java rekursiv

import java.math.BigInteger; 

public class LucasSeries { 

    private static BigInteger TWO = BigInteger.valueOf(2); 

    public static BigInteger fibonacci(BigInteger number) { 
     if (number.equals(BigInteger.ZERO) || number.equals(BigInteger.ONE)) { 
      return number; 
     } else { 
      return fibonacci(number.subtract(BigInteger.ONE)).add(fibonacci(number.subtract(TWO))); 
     } 
    } 

    public static void main(String[] args) { 
     for (int counter = 0; counter <= 30; counter++) { 
      System.out.printf("Lucas of %d is: %d%n", counter, 
       fibonacci(BigInteger.valueOf(counter))); 
     } 
    } 
} 
+1

Bitte geben Sie den zutreffenden Fehlercode und die Nachricht (en) an – Prune

+0

Wenn ich Ihre Frage verstehe, funktioniert dieser Code, aber eine Menge anderer Dinge, die Sie versucht haben, hat nicht funktioniert? Was waren diese Dinge? Wie haben sie nicht funktioniert? –

+1

Beachten Sie, dass das Argument von "fibonacci" kein 'BigInteger' sein muss. Ein "int" wird gut funktionieren, wenn Sie nicht über die 2147483647. Fibonacci-Nummer hinausgehen müssen, was eine schlechte Idee ist. Der Rückgabetyp kann ein 'BigInteger' sein. –

Antwort

3

Es gibt zwei Basis Fälle N(0) und N(1). Sie können kombinieren diese, aber der Code genauer übereinstimmt the series definition, wenn man sie getrennt behandeln, wie in:

public static BigInteger fibonacci(BigInteger number) { 
    if (number.equals(BigInteger.ZERO)) 
     return TWO; 

    if(number.equals(BigInteger.ONE)) 
     return BigInteger.ONE; 

    return fibonacci(number.subtract(BigInteger.ONE)).add(
      fibonacci(number.subtract(TWO))); 
} 

Es produziert die folgende Ausgabe:

Lucas of 0 is: 2 
Lucas of 1 is: 1 
Lucas of 2 is: 3 
Lucas of 3 is: 4 
Lucas of 4 is: 7 
Lucas of 5 is: 11 
Lucas of 6 is: 18 
Lucas of 7 is: 29 
Lucas of 8 is: 47 
// Remainer omitted 
2

Statt

if (number.equals(BigInteger.ZERO) || number.equals(BigInteger.ONE)) 
    return number; 

einfach zurück

if (number.equals(BigInteger.ZERO) || number.equals(BigInteger.ONE)) { 
    return TWO.subtract(number); 

das ist alles.

+0

OP möchte '0 => 2' und' 1 => 1'. Nicht sicher, wo du diese Idee hast. –

+0

@AlexHall ok kein Problem, ich reparierte es, danke für das Aufzeigen. – maraca