Fibonaccizahlen

philippsch

Neues Mitglied
Hallo zusammen, ich habe ein Programm geschrieben, das prüft ob eine Zahl eine Fibonaccizahl ist oder nicht. Allerdings kommt wenn ich das Programm ausführe immer diese Fehlermeldung:
Exception in thread "main" java.lang.NullPointerException
at Main.main(Main.java:20)
Weiß jemand von euch was ich falsch gemacht habe?

Java:
public static void main(String[] args)
    {
        boolean isFibonacci;
        Integer x = 4;
        Integer i;
        
        Integer[] Fibonacci = new Integer[2];
        Fibonacci[0] = 0;
        Fibonacci[1] = 1;
        
        
        
        if (x != 0 && x != 1) {    for (i = 2; Fibonacci[i-1] <= x; i++)
        {
                Integer n = Fibonacci.length;
                Fibonacci = Arrays.copyOf(Fibonacci, n + 1);
                Fibonacci[n-1] = Fibonacci[i-1] + Fibonacci[i-2];   
            
        }
        List<Integer> list1 = new ArrayList<>(Arrays.asList(Fibonacci));
        if (list1.contains(x))
            isFibonacci = true;
        else
            isFibonacci = false;
        }
        
        else {
            isFibonacci = true;
        }
        
        if (isFibonacci = true)
            System.out.println(x + " ist eine Fibonaccizahl.");
        else
            System.out.println(x + " ist keine Fibonaccizahl.");

            
    }
 

KonradN

Super-Moderator
Mitarbeiter
Weiß jemand von euch was ich falsch gemacht habe?
In erster Linie hast Du uns nicht gsagt, was die Zeile 20 original war, da Du nur die main Methode kopiert hast und nicht die ganze Klasse.

Dann hast Du Dich nicht an die Naming Standards gehalten - das macht den Code schwer lesbar.

Dann hast Du beim Copy & Paste offensichtlich einen Fehler gemacht: Zeile 23-16 ist doppelt.

Dann hast Du im Vergleich statt dem Vergleich die Zuweisung (Zeile 31 in dem Code deines Posts).

Der ganze Ansatz ist ansonsten auch schon recht dubios:
  • Du erzeugst ständig neue Arrays?
  • Wieso durchsuchst du dann die ganze Liste? Du hast die Fibonacci-Zahlen erzeugt bis Du eine Zahl hast, die größer ist. Dann ist die vorletzte Zahl entweder die gegebene Zahl oder nicht. Also kein Grund, da dann alles zu durchsuchen.


Geh so Algorithmen immer mit Stift und Papier durch. Du wirst doch beim Durchgehen mit Stift und Papier nicht ständig die ganze Liste an Zahlen neu aufschreiben! Du brauchst ja nur die Zahlen zur Berechnung der nächsten Fibonacci-Zahl. Du musst also nicht einmal die ganze Liste merken.
 

MarvinsDepression

Bekanntes Mitglied
Java:
    public static boolean isFibonacci(int num) {
        if (num == 0 || num == 1) {
            return true;
        }
        int a = 0, b = 1, c = 1;
        while (c < num) {
            c = a + b;
            a = b;
            b = c;
        }
        return (c == num);
    }
Aber eben genau so fehlerhaft. Die Abbruchbedingung funktioniert nicht richtig (für große Werte als Parameter), weil ein Überlauf in c nicht erkannt wird.

Java:
public static boolean isFibonacci(int value) {
    if (value == 0) return true;
    
    int currentFib = 1;
    int lastFib = 0;
    
    while (currentFib > 0 && currentFib < value) {
        int nextFib = currentFib + lastFib;
        lastFib = currentFib;
        currentFib = nextFib;
    }
    return (currentFib == value);
}
würde das dann schon besser machen, wenns auch nicht schöner Code ist.
 

Neue Themen


Oben