Fibonacci Zahlen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Wabi_
User
Beiträge: 2
Registriert: Samstag 19. November 2022, 10:01

Hallo zusammen, ich bin neu hier und fange gerade an Python zu lernen. Ich hoffe daher, dass meine Frage nicht allzu doof ist, aber ich will eine Aufgabe schaffen und check irgendwie grad einfach nicht mehr, wie es gehen könnte. Ich will eine Funktion erstellen, die die n-th Fibonacci Folge erstellt, sowohl im positiven als auch im negativen Bereich. Im positiven Bereich klappt es super, aber ich möchte sie auch mit der selben Vorgehensweise in die negative Richtung machen, nur leider funktioniert das nicht. Ich habe schon viele Varianten ausprobiert, hier seht ihr den Code wo ich jetzt einfach mal das Minus- und Pluszeichen getauscht habe. Wisst ihr vielleicht, wo mein Denkfehler liegt? Danke schon mal im Voraus.

Code: Alles auswählen

def fib(n: int):
    if n >= 0:
        a = [0, 1]
        for i in range(2, n+1):
            a.append(a[i-1] + a[i-2])
        return a[n]
    if n <= -1:
        b = [0, 1]
        for j in range(2, n+1):
            b.append(b[j+1] - b[j+2])
        return b[n]
print(fib(-8))
Und dann müsste es mir immer die aktuelle Fib Zahl anzeigen, je nachdem welche man haben möchte zB -8. Bei +8 stimmt das Ergebnis mit 21, bei den negativen Zahlen steht aber dann list index out of range
Benutzeravatar
__blackjack__
User
Beiträge: 14069
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Wabi_: Das ist ja auch das was man erwarten würde. Warum denkst Du denn es sollte dort kein `IndexError` ausgelöst werden? Geh das doch einfach mal Schritt für Schritt, Teilausdruck für Teilausdruck durch für -8. Das erste ``if`` trifft nicht zu. Beim zweiten ``if`` wird der Zweig ausgeführt. Als erstes wird `b` an eine Liste mit den zwei Elementen 0 und 1 gebunden. Dann kommt die ``for``-Schleife die aber nicht durchlaufen wird, weil `range(2, -7)` keine Elemente enthält. Und dann wird im letzten Schritt versucht auf das -8.te Element von der zweielementigen Liste zuzugreifen. Was ganz offensichtlich nicht geht, weil es dieses Element nicht gibt.

Code: Alles auswählen

In [261]: range(2, -8 + 1)
Out[261]: range(2, -7)

In [262]: len(range(2, -8 + 1))
Out[262]: 0

In [263]: list(range(2, -8 + 1))
Out[263]: []

In [264]: b = [0, 1]

In [265]: b[-8]
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
Input In [265], in <cell line: 1>()
----> 1 b[-8]

IndexError: list index out of range
Wie definierst Du denn überhaupt negative Fibonacci-Zahlen? Nach der üblichen Definition ist das ja eigentlich entweder undefiniert, also ein Fehler, oder man definiert alles vor dem Startzeitpunkt/-schritt als 0.

Bezüglich der Lösung für den positiven Teil ist das übrigens ziemlich ineffizient was den Speicherverbrauch angeht. Es macht nicht so wirklich Sinn *alle* Zahlen in einer Liste zu sammeln wenn man in jedem Schritt nur auf die letzten beiden Elemente zugreift. Man muss sich nur diese zwei Werte merken, die man für den jeweils nächsten Schritt benötigt. Die übliche Lösung dafür sieht so aus:

Code: Alles auswählen

def fib(n):
    a, b = 0, 1
    for _ in range(n):
        a, b = b, a + b
    return a
Da würde ich dann auch gleich noch anmerken wollen, dass `a` und `b` keine wirklich guten Namen für Listen sind. Beide Variablen würden in Deinem Code passender den Namen `fibonacci_numbers` haben, denn das ist es was hinter dem Namen an Werten steckt.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Wabi_
User
Beiträge: 2
Registriert: Samstag 19. November 2022, 10:01

Vielen, vielen Dank für deine Antwort, ich werde alles noch mal anhand deines Feedbacks durchdenken.
Antworten