Seite 1 von 2

Rekursive Funktion2

Verfasst: Sonntag 3. Juni 2018, 10:34
von StareDog
Hey,

hab wieder eine neue rekursive Funktion zu lösen.

Schreiben Sie rekursive Funktionen zur Lösung folgender Aufgaben. Worte sind durch Leerzeichen getrennt.
Alle Grenzen sind inklusiv.
Hinweis: Sie können auf die Buchstaben einer Zeichenkette wie auf die Elemente eines Feldes mit dem
Operator [] zugreifen.
1. Wie häufigg kommt ein Zeichen f in einer Zeichenkette s von Position 0 bis Position p vor?:
numOf(s, f, p)

Code: Alles auswählen

s = "Falle Pferd Falaffel Frankfurt"
def num0f(s,f,p):
    if p<0:
        raise ValueError("out of range")
    if p==0:
        if s[p] == f:
            return 1
        else:
            return 0
    else:
        num0f(s,f,p-1) + s[p]

print(num0f(s,0,15))
und zwar wollte ich eben, dass er die Anzahl der gefundenen f aufsummiert, allerdings gibt es da wohl einen error wegen des typs. s[p] dürfte ja wohl ein string sein wogegen num0f ein integer ist, oder?

Habt ihr einen besseren Ansatz für diese Lösung bzw. wie ich hier weiter komme?

Was stellt f überhaupt dar in der funktion? ein Zähler der "f" innerhalb der range?

Re: Rekursive Funktion2

Verfasst: Sonntag 3. Juni 2018, 11:41
von __deets__
"Zeichen f". Warum gibst du da also eine 0 rein, statt einem Buchstaben?

Re: Rekursive Funktion2

Verfasst: Sonntag 3. Juni 2018, 11:50
von ThomasL
StareDog hat geschrieben: Sonntag 3. Juni 2018, 10:34 Was stellt f überhaupt dar in der Funktion?
Sie können auf die Buchstaben einer Zeichenkette wie auf die Elemente eines Feldes mit dem Operator [] zugreifen.
Wie häufig kommt ein Zeichen f in einer Zeichenkette s von Position 0 bis Position p vor?:

num_of(zeichenkette, zeichen, position)

Re: Rekursive Funktion2

Verfasst: Sonntag 3. Juni 2018, 13:42
von StareDog
__deets__ hat geschrieben: Sonntag 3. Juni 2018, 11:41 "Zeichen f". Warum gibst du da also eine 0 rein, statt einem Buchstaben?
ich hatte nur etwas rumgespielt. Die funktion hatte so nicht funktioniert und ich hatte irgendwie überlegt f sei vielleicht als zähler zu sehen.

Code: Alles auswählen

s = "Falle Pferd Falaffel Frankfurt"
def num0f(s,f,p):
    if p<0:
        raise ValueError("out of range")
    if p==0:
        if s[p] == "f":
            return 1
        else:
            return 0
    else:
        num0f(s,f,p-1) + s[p]

print(num0f(s,f,15))
hier bekomme ich den fehlercode "name f is not defined" in der printcommandozeile (deswegen auch der Versuch einen Wert für f einzugeben. Wie soll ich f denn definieren?

Re: Rekursive Funktion2

Verfasst: Sonntag 3. Juni 2018, 13:47
von __deets__
Na, du definierst ja auch kein f im auesseren Scope, dessen Wert du dann uebergeben wuerdest.

Der Unsterschied zwischen

Code: Alles auswählen

funktion(f)
und

Code: Alles auswählen

funktion("f")
ist dir schon klar, oder?

Re: Rekursive Funktion2

Verfasst: Sonntag 3. Juni 2018, 13:54
von ThomasL
hier bekomme ich den fehlercode "name f is not defined"
entweder du erzeugst vorher eine Variable f der du einen Buchstaben zuweist, nach dem gesucht werden soll
oder du übergibst im Funktionsaufruf den Buchstaben als String z.B. "f"

Code: Alles auswählen

s = "Falle Pferd Falaffel Frankfurt"

def num0f(s,f,p):
    if p<0:
        raise ValueError("out of range")
    if p==0:
        if s[p] == "f":      # hier vergleichst du immer ob der Buchstabe ein "f" ist, das ist so nicht gewünscht, "" weglassen
            return 1
        else:
            return 0
    else:
        num0f(s,f,p-1) + s[p]

print(num0f(s,f,15))    #  wo hast du denn f definiert ?

Re: Rekursive Funktion2

Verfasst: Sonntag 3. Juni 2018, 13:57
von StareDog
funktion(f) ist eine Funktion mit der Variable f.

und funktion("f") " " bedeutet ja f ist als string definiert und keine variable.

was würde denn eine funktion("f") denn machen? ergibt das überhaupt sinn?

Re: Rekursive Funktion2

Verfasst: Sonntag 3. Juni 2018, 14:02
von StareDog
ich glaube ich kapiere erst jetzt, dass

"Wie häufig kommt ein Zeichen f" gar nicht den Buchstaben f meint, sondern ein vorher bestimmtes zeichen f. ist das korrekt?
also zum beispiel f = k oder f = $ je nach definition

Re: Rekursive Funktion2

Verfasst: Sonntag 3. Juni 2018, 14:12
von __deets__
Jein. Ja, f ist ein variables Zeichen. Aber deine beiden Zuweisungen wieder falsch:

f = "k"

rspektive

f = "$"

muss es heißen.

Re: Rekursive Funktion2

Verfasst: Sonntag 3. Juni 2018, 15:04
von StareDog
genau.

Code: Alles auswählen

s = "Falle Pferd Falaffel Frankfurt"
f = "f"
def num0f(s,f,p):
    if p<0:
        raise ValueError("out of range")
    if p==0:
        if s[p] == f:
            return 1
        else:
            return 0
    else:
        num0f(s,f,p-1)+s[p]

print(num0f(s,f,15))
so dürfte es besser aussehen.

num0f8(s,f,p-1) +s[p] ergibt nun aber einen TypeError: unsupported operand type(s) for +: 'int' and 'str'

Re: Rekursive Funktion2

Verfasst: Sonntag 3. Juni 2018, 16:01
von __deets__
Naja, deine Funktion macht halt nicht was sie soll. s[p] ist ja nun ein Buchstabe an der Stelle p. Das ist aber wohl kaum das, was du auf den rekursiven Schritt addieren willst. Sondern etwas anderes.

Re: Rekursive Funktion2

Verfasst: Montag 4. Juni 2018, 07:52
von StareDog
dankeschön für das feedback.

ich denke ich hab die Lösung jetzt.

Code: Alles auswählen

s = "falle Pferd falaffel Frankfurt"
f = "f"
def num0f(s,f,p):
    if p<0:
        raise ValueError("out of range")
    if p==0:
        if s[p] == f:
            return 1
        else:
            return 0
    else:
        if s[p] == f:
            return num0f(s,f,p-1)+1
        else:
            return num0f(s,f,p-1)

print(num0f(s,f,15))
Gibt es eine Möglichkeit auch mehrer Buchstaben zu suchen? also f = "f" and "F". in dem oberen Beispiel sucht er ja nur die kleinen f. wenn ich f = "f" and "F" oder f = "f" or "F" nutze, gibt er bei and das "F" aus und bei or das "f". Wie ist das zu erklären?

Re: Rekursive Funktion2

Verfasst: Montag 4. Juni 2018, 07:57
von Sirius3
Und wie immer, wären gute Variablennamen eine deutliche Verbesserung:

Code: Alles auswählen

def count_character(text, character, end_position):
    if end_position < 0:
        return 0
    return count_character(text, character, end_position - 1) + (text[end_position] == character)

Re: Rekursive Funktion2

Verfasst: Montag 4. Juni 2018, 08:14
von StareDog
das stimmt natürlich. Wir müssen unsere Ergebnisse für die Uni immer in einer Plattform hochladen, wo der Scaffold Head vorgegeben ist mit den oben genannten variablen.

Code: Alles auswählen

s = "Falle PFerd falaffel Frankfurt"
f= "f"
def num0f(s, f, p):
    if p < 0:
        return 0
    return num0f(s, f, p - 1) + (s[p] == f)

print(num0f(s,f,15))
hab deinen code nochmal für mich umgeschrieben um es mit dem anderen zu vergleichen. Ist natürlich viel einfacher. s[p] == f wird ja dann im falle, dass es stimmt mit 1 zurückgegeben und aufsummiert. damit kann ich natürlich meine komplexe Rückgabe deutlich vereinfachen.

Deine dürfte von der Laufzeit auch kürzer sein oder? Kann ich das irgendwie vergleichen?

Re: Rekursive Funktion2

Verfasst: Montag 4. Juni 2018, 10:14
von __blackjack__
Ich denke nicht das man die Laufzeit bei solchen Mikrobenchmarks *sinnvoll* vergleichen kann, vor allem weil hier der Mehraufwand für die Funktionsaufrufe, zumindest bei CPython, alles andere in den Schatten stellen dürfte.

Und eigentlich würde man in Python `s.count('f', 0, 15)` schreiben, und da kommt keine selbst geschriebene Funktion gegen an, schon gar keine Rekursive. :-)

Edit: Ich sehe übrigens immer noch keinen Grund die Argumentnamen und die lokalen Namen nicht vernünftig zu wählen, denn die sind ja vom Aufruf durch die Online-Plattform unabhängig.

Re: Rekursive Funktion2

Verfasst: Montag 4. Juni 2018, 12:18
von StareDog
da hast du vermutlich recht. War nur persönliches Interesse.

also bei anderen codes mussten die Variablen wie vorgegeben durch die Plattform gewählt werden im code damit ist funktioniert hat. Also die Plattform setzt dann für die variablen irgendwas ein und schaut ob der code richtig funktioniert. Und es wird eben def num0f(s,f,p) vorgegeben. Ich glaube das meintest du mit den vernünftigen Namen

Re: Rekursive Funktion2

Verfasst: Montag 4. Juni 2018, 12:28
von __deets__
Nein. Bzw auch. Aber IN deiner Funktion können und sollten die anders heißen.

Re: Rekursive Funktion2

Verfasst: Dienstag 5. Juni 2018, 09:08
von StareDog
__deets__ hat geschrieben: Montag 4. Juni 2018, 12:28 Nein. Bzw auch. Aber IN deiner Funktion können und sollten die anders heißen.
Ok, zum verständnis? Oder wieso sollten sie anders heißen?

Re: Rekursive Funktion2

Verfasst: Dienstag 5. Juni 2018, 09:57
von __deets__
Ja. Das ist der Sinn sinnvoller Bennenungen. Das auch Zukunft-StareDog in 3 Wochen noch begreift, was die Variablen bezeichnen.

Re: Rekursive Funktion2

Verfasst: Dienstag 5. Juni 2018, 12:54
von ThomasL
__deets__ hat geschrieben: Dienstag 5. Juni 2018, 09:57 Ja. Das ist der Sinn sinnvoller Benennungen. Das auch Zukunft-StareDog in 3 Wochen noch begreift, was die Variablen bezeichnen.
:shock: :lol: :lol: :lol: :lol: :mrgreen: