kodierung mit fibonacci

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
checknix
User
Beiträge: 3
Registriert: Montag 24. März 2014, 12:41

also habe kaum python erfahrungen, besuche einen !einsteiger kurs(ohne vorkenntnisse!) und nach dem zweiten Termin (etwa 90 min Lehrinhalt in den erklärt würde was unterschied zwischen for und while schleifen und fruitfullfunctions sind, haben wir folgnede aufgabe bekommen:


Schreibe ein Programm, das ein verschlüsseltes
Passwort erstellt! Der User soll sein Geburtsdatum
eingeben können (erst Tag, dann Monat, dann Jahr).
Den jeweiligen Tag (z.B. 10ter) kodiert das Programm
in Form der jeweiligen Fibonacci-Zahl (hier 10te = 34).
Das gleiche macht es für den Monat und das Jahr und
setzt so das neue Passwort zusammen.
Schreibe zur Übersichtlichkeit eine passende
Fibonacci-Funktion, die vom Programm mehrmals
aufgerufen werden kann!

besten dank für ideen
einfache die ich hin bekomme:

Code: Alles auswählen

def f(n):
    if n>=2: return(f(n-1)+f(n-2))
    elif n==1 : return 1
    elif n==0 : return 0

x=int(raw_input('Eingabe:'))
for i in range(x):
    var = (f(i))
print var
Zuletzt geändert von Anonymous am Montag 24. März 2014, 13:34, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
BlackJack

@checknix: Die erste Idee ist die Fibonacci-Funktion nicht rekursiv zu formulieren, denn das Jahr 2014 wirst Du damit nicht berechnet bekommen.

Erklär doch mal den Sinn der Schleife in Deinem Programm‽

Was sind denn „fruitfullfunctions”?
checknix
User
Beiträge: 3
Registriert: Montag 24. März 2014, 12:41

nun ja nach insgesamt 180 min mit python weiss ich das selber nciht. ich glaube der dozent hat einen knax, das war der inhalt der stunde:

Code: Alles auswählen

zahl = 12
raten = 0
print "bitte raten!"
while raten != zahl:
    raten = raw_input("raten: ")
    raten =int(raten)
else:
    print "richitg"
#Benutzersteurung Benutzerabfrage
while True:
    zahl= int(raw_input('zahl: '))
    if zahl < 0:
        print 'nicht erlaubt'
        continue
    elif zahl == 'end':
        print 'ende'
        break
    else:
        print 'zahl erlaubt'
#Berechnungen
##        erg = 1
##        while zahl > 0:
##           
##            erg = erg *zahl
##            zahl =zahl -1
##        print 'ergebnis: ', erg
        erg = 1
       
        for i in range(2,zahl+1):
                erg=erg*i
        print erg
                
print 'done'
    

#Benutzersteurung Benutzerabfrage
while True:
    zahl= int(raw_input('zahl: '))
    if zahl < 0:
        print 'nicht erlaubt'
        continue
    elif zahl == 'end':
        print 'ende'
        break
    else:
        print 'zahl erlaubt'
#Berechnungen
        erg = 1
        while zahl > 0:
           
            erg = erg *zahl
            zahl =zahl -1
        print 'ergebnis: ', erg
print 'done'

und das ist die unten genannte hausübung
nun wie kann ich die aufagbe lösen. ich brauch kein skript, nur eine bauplan!
Zuletzt geändert von Anonymous am Montag 24. März 2014, 14:57, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
BlackJack

@checknix: Na Du brauchst eine Funktion zum berechnen der n-ten Fibonacci-Zahl, und zwar eine die nicht rekursiv arbeitet. Und dann eine Funktion die vom Benutzer eine Zahl abfragt, denn das musst Du ja drei mal machen, und da sollte man natürlich nicht drei mal den gleichen Quelltext schreiben müssen.

Das erstellen des Passworts würde ich auch in eine Funktion stecken. Halt das Gesamtproblem in kleinere Teilprobleme zerlegen, solange bis man die kleinsten Teilprobleme mit kleinen Funktionen lösen kann, aus denen man dann Teillösungen für die Teilprobleme aus höheren Ebenen als einfache Funktionen schreiben kann.

Was bedeutet es denn aus den drei Fibonaccizahlen das neue Passwort zusammenzusetzen? Soll man die Addieren, Multiplizieren, deren Zeichenkettendarstellung einfach aneinander hängen?

Edit: Ich weiss jetzt was „fruitful functions” sind: Das Buch „How to Think Like a Computer Scientist” nennt so Funktionen die einen expliziten Rückgabewert haben, als Abgrenzung zu Funktionen die nur ihres Effektes wegen aufgerufen werden. Also das was man traditionell auch als den Unterschied zwischen (echten) Funktionen und Prozeduren kennt. Das Kapitel könntest Du Dir mal durchlesen: http://openbookproject.net/thinkcs/pyth ... tions.html
checknix
User
Beiträge: 3
Registriert: Montag 24. März 2014, 12:41

'Und dann eine Funktion die vom Benutzer eine Zahl abfragt, denn das musst Du ja drei mal machen, und da sollte man natürlich nicht drei mal den gleichen Quelltext schreiben müssen. ". Mir ist das nach eineer Woche rumprbieren beim besten Willen nicht gelungen, eine Idee? ich dreh beinahe durch erst recht mit dem Vorwissen.

Besten Dank bis dato
. also Fib sieht jetz so aus:;

Code: Alles auswählen

def Fibonacci(a=200): ## Fibonacci funktion wird definiert mit default Wert --> kann bei Funktionsaufruf abgeaendert werden
    Zahl1 = 0
    print Zahl1
    Zahl2 = 1
    print Zahl2
    Zahl3 = 0
    while (Zahl3 < a):
        Zahl3 = Zahl1 + Zahl2
        print Zahl3, "Funktion"
        
        Zahl1 = Zahl2
        Zahl2 = Zahl3

    return Zahl3 ##gibt letzte Zahl der Folge aus
Zuletzt geändert von Anonymous am Montag 31. März 2014, 21:03, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
BlackJack

@checknix: Woran scheitert es denn? Du kennst ja die eingebaute Funktion `raw_input()`. Was jetzt gefragt ist, wäre eine Funktion die so ähnlich funktioniert, aber keine Zeichenkette liefert, sondern eine Zahl. Und die sollte die Frage solange wiederholen bis der Benutzer tatsächlich eine Zahl eingegeben hat, denn sonst kann das Programm ja nicht weiterarbeiten.

Die Fibonacci-Funktion hat zum iterativen Berechnen schon den richtigen Ansatz, aber das Argument und die Abbruchbedingung passen nicht zur Aufgabenstellung. Man soll ja nicht die erste Fibonacci-Zahl berechnen die grösser als ein gegebenes `a` ist, sondern die `a`-te Zahl. Hier wäre `n` auch ein besserer Name, denn „die `n`-te Zahl” hört sich deutlich vertrauter an. :-)
Benutzeravatar
HarteWare
User
Beiträge: 69
Registriert: Samstag 23. Februar 2013, 21:16
Wohnort: localhost

Hallo zusammen,

ich komme ja ungern vom Thema ab, aber ich hab hier diesen Code gelesen und frage mich, wie kann etwas das zu int convertiert wurde ein string ('end') sein? Kenn ich da Python noch nicht so gut?

Code: Alles auswählen

#Benutzersteurung Benutzerabfrage
while True:
    zahl= int(raw_input('zahl: '))
    if zahl < 0:
        print 'nicht erlaubt'
        continue
    elif zahl == 'end':  # hier mein ich
        print 'ende'
        break
    else:
        print 'zahl erlaubt'
Ich hoffe da kann mich jemand aufklären

mfg
HarteWare
Sirius3
User
Beiträge: 18335
Registriert: Sonntag 21. Oktober 2012, 17:20

@HarteWare: Da kennst Du Python gut genug. Diese Bedingung kann nie erfüllt werden.
Antworten