Billiges Fibonacci Programm...Anfänger braucht Hilfe

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
Benutzeravatar
Püton
User
Beiträge: 2
Registriert: Montag 18. August 2014, 18:59

Guten Tag!

Ich habe mich heute bei Euch angemeldet, da ich derzeit versuche mich in Python einzulesen bzw es zu lernen.
Ich tippe den Code immer ab, versuche danach ein ähnliches Beispiel nachzuschreiben um auch den Sinn dahinter zu verstehen.
Wenn ich es mal nicht verstehe, gehe ich den Code so oft durch bis ich weiß welche Zeile was bewirkt.
Allerdings beiße ich mir die Zähne aus, da ich schon seit einer halben Stunde grüble und die Antwort wahrscheinlich doch so einfach ist.

PS: Suchfunktion hab ich benutzt, allerdings bekomm ich keine Ergebnisse die mir weiterhelfen können..

Vielleicht kann mir hier jemand erklären wie das Ergebnis zustande kommt:

Code: Alles auswählen

def fib_intervall(x):
    """returns the largest fibonacci
    number smaller than x and the lowest
    fibonacci number higher than x"""
    if x < 0:                               
        return -1
    (old,new, lub) = (0,1,0)
    while True:
        if new < x: 
            lub = new 
            (old,new) = (new,old+new) 
        else:
            return (lub, new) 

while True:
    x = int(input("Your number?: "))
    if x <= 0:
        break
    (lub,sup) = fib_intervall(x)
    print("Lagrest Fibonacci Number smaller than x: " + str(lub))
    print("Smallest Fibonacci Number larger than x: " + str(sup))
    
Ich habs Probeweise mit der Zahl 7 probiert..


Ich weiß, dass wenn ich 0 bzw eine negative Zahl eingebe nichts passiert.

Ich komm ums verrecken nicht ans Ergebnis.. :(
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Was genau willst Du denn jetzt von uns wissen? Welche konkrete Frage hast Du? Der Code ist an sich nicht komplex oder kompliziert. Wo genau hast Du denn Schwierigkeiten?

Die Schreibweise mit den unnötigen Klammern um die Tupel wirkt allerdings unschön, und ``lub`` empfinde ich jetzt auch nicht so dolle - was soll das eigentlich heißen? "lowest upper bound"?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Sirius3
User
Beiträge: 18335
Registriert: Sonntag 21. Oktober 2012, 17:20

@Püton: die Funktion ist ziemlicher Schrott. Vielleicht wird die selbe Funktion in schöner, klarer:

Code: Alles auswählen

def fib_intervall(x):
    """returns the largest fibonacci
   number smaller than x and the lowest
   fibonacci number higher than x"""
    if x < 0:
        raise ValueError('x must be >= 0')
    prev_fib = 0
    next_fib = 1
    while next_fib < x:
        prev_fib, next_fib = next_fib, next_fib + prev_fib
        print(prev_fib, next_fib)
    return prev_fib, next_fib
Ich habe auch noch ein print eingebaut, das die einzelnen Schritte ausgibt.
Benutzeravatar
Püton
User
Beiträge: 2
Registriert: Montag 18. August 2014, 18:59

Ich komme bis Zeile 7.
Hier wird old = 0, new = 1, und lub = 0 zugewiesen oder?
Dann beginnt die Endlosschleife (While True).
Hier wird abgefragt (if) ob new (das 1 ist?) kleiner als x(in diesem Fall 7)
ist.Zeile 10 überprüft: Wenn ja dann ist lub = new. Haben jetzt lub und new beide jeweils einen Wert von 1??
in Zeile 11 wird jetzt zu old der Wert von new addiert, in dem Fall auch 1.
Ich glaube das ich hier einfach eine falsche vorgehensweiße habe.
Wenn ich 7 eingebe ist die kleinere Fibonacci Zahl 5...Doch wie errechnet sich diese 5??

Das es für Dich einfach ist ist mir klar, nur ich glaube ich stehe grad extrem auf der Leitung...

EDIT: Oh Sirius3 gerade deine Antwort gesehn, werde mich nochmal dahinterklemmen und deinen Code durchgehen! Vorerst danke für die Hilfe!
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

@Püton: Auch wenn der obige Code nicht der dollste ist, so könntest Du ihn einfach mit ``print``s ergänzen, um Dir die einzelnen Schritte klar zu machen. Da musst Du nicht einmal raten :-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
BlackJack

@Püton: Der Code ist übrigens fehlerhaft, nämlich genau dann wenn man eine Fibonacci-Zahl eingibt. Dann stimmen die ausgegeben Aussagen nicht.
bb1898
User
Beiträge: 219
Registriert: Mittwoch 12. Juli 2006, 14:28

Püton hat geschrieben: Wenn ich 7 eingebe ist die kleinere Fibonacci Zahl 5...Doch wie errechnet sich diese 5??
Das klärst Du am besten, indem Du mal nachsiehst, wie die Fibonacci-Folge definiert ist (hier ist Wikipedia Deine Freundin, die erste Zeile des Artikels tut es schon). Die 5 ist hier völlig richtig.
Antworten