Rekursive Funktion2

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
StareDog
User
Beiträge: 50
Registriert: Donnerstag 19. April 2018, 09:59

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?
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

"Zeichen f". Warum gibst du da also eine 0 rein, statt einem Buchstaben?
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

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)
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
StareDog
User
Beiträge: 50
Registriert: Donnerstag 19. April 2018, 09:59

__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?
Zuletzt geändert von StareDog am Sonntag 3. Juni 2018, 13:52, insgesamt 1-mal geändert.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

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?
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

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 ?
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
StareDog
User
Beiträge: 50
Registriert: Donnerstag 19. April 2018, 09:59

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?
StareDog
User
Beiträge: 50
Registriert: Donnerstag 19. April 2018, 09:59

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
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Jein. Ja, f ist ein variables Zeichen. Aber deine beiden Zuweisungen wieder falsch:

f = "k"

rspektive

f = "$"

muss es heißen.
StareDog
User
Beiträge: 50
Registriert: Donnerstag 19. April 2018, 09:59

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'
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
StareDog
User
Beiträge: 50
Registriert: Donnerstag 19. April 2018, 09:59

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?
Zuletzt geändert von StareDog am Montag 4. Juni 2018, 07:59, insgesamt 1-mal geändert.
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

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)
StareDog
User
Beiträge: 50
Registriert: Donnerstag 19. April 2018, 09:59

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?
Benutzeravatar
__blackjack__
User
Beiträge: 13003
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

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.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
StareDog
User
Beiträge: 50
Registriert: Donnerstag 19. April 2018, 09:59

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
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Nein. Bzw auch. Aber IN deiner Funktion können und sollten die anders heißen.
StareDog
User
Beiträge: 50
Registriert: Donnerstag 19. April 2018, 09:59

__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?
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ja. Das ist der Sinn sinnvoller Bennenungen. Das auch Zukunft-StareDog in 3 Wochen noch begreift, was die Variablen bezeichnen.
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

__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:
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Antworten