Wie zu zählen, die in einer rekursiven Funktion? [python]
Schrieb ich eine rekursive Funktion zu finden, die keine. von Instanzen einer Teilzeichenfolge in die übergeordnete Zeichenfolge.
So wie ich bin, mitgezählt wird durch die Deklaration/Initialisierung zählen als eine Globale variable außerhalb der Funktion gültig ist. Problem ist, es werden mir die richtigen Ergebnisse wird nur die erste Ausführung der Funktion, da danach zählen != 0 zu beginnen. Und wenn ich es habe innerhalb der Funktion, als jedes mal rekursiv aufgerufen wird, es werden auf 0 gesetzt werden.
count=0
def countSubStringMatchRecursive(target,key):
index=find(target,key)
global count
targetstring=target
if index>=0:
count=count+1
target=target[index+len(key):]
countSubStringMatchRecursive(target,key)
else :
pass
return "No. of instances of", key, 'in', targetstring, 'is', count
Hinweis: ich bin auf der Suche nach der Lösung für ein recursive
Funktion speziell, ich habe eine iterative Funktion, die funktioniert einwandfrei.
EDIT: Danke Euch allen, das war Teil der Hausaufgabe, also war ich nur mit dem string-Modul
InformationsquelleAutor der Frage gsin | 2010-01-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Eine Möglichkeit den code so ändern, wäre die Verwendung einer lokalen Funktion wie folgt:
InformationsquelleAutor der Antwort Greg Hewgill
Ihre rekursive Funktion hat O(n^2) Leistung, da es kopiert den restlichen Inhalt der Zeichenfolge jedes mal, wenn es eine übereinstimmung findet. Diese ist langsamer als die iterative Lösung O(n) und so unnötig.
Können Sie leicht umschreiben, dass es schneller zu sein, und gleichzeitig den code vereinfachen und erweitern seine Funktionalität, indem eine start-index für die Suche als optionaler parameter der Funktion:
Ausgabe:
Update: Wenn Sie wirklich wollen, verwenden Sie die string-Modul suchen-Funktion, Sie können dies tun, einfach durch änderung einer Zeile:
InformationsquelleAutor der Antwort Mark Byers
Hier ist etwas ähnlich wie Greg Hewgill Antwort. Aber stattdessen gehen wir zusammen den aktuellen Zählerstand jedes mal, wenn wir die Funktion aufrufen, und dann wieder die zählen, wenn es gibt keine mehr Spiele gemacht werden. Während ich vermute, es macht keinen Unterschied, in Python, in Sprachen, die Implementierung der tail-call-recursion, dies ermöglicht jedem nachfolgenden Aufruf
do_count
optimiert werden, die sofort auf den call-stack. Dies bedeutet, dass jeder Aufrufdo_count
nicht dazu führen, dass der call-stack, um zu wachsen.InformationsquelleAutor der Antwort Michael Williamson
Nur eine Randnotiz: alle Lösungen präsentiert werden (von der original-Q alle) sind, ein problem zu lösen, die anders als die ausdrücklich sagte, man (ich vorstellen, das ist ein Fehler in der spezifischen Problemstellung, aber Wert Festsetzung, wenn so;-). Bedenken Sie:
der erste Ausdruck zählt die nicht-überlappende vorkommen von 'ana' in 'Banane'; das zweite ist, zählen alle vorkommen -- es gibt zwei Ereignisse in allen, bei Indizes 1 und 3 in "Banane", und Sie überlappen. Also da das problem Erklärung, und ich zitiere:
ohne jede Erwähnung von "nicht-überlappend", es scheint, dass überschneidungen vorkommen sollte gezählt werden. Natürlich, das ist leicht zu beheben, sobald bemerkt-Sie müssen nur vorher 1 jedes mal, anstelle der Förderung von
len(key)
was führt Sie zu überspringen, einander überschneidende vorkommen.So, zum Beispiel:
Drucke
2
zählen beide (sich überlappende) Ereignisse.InformationsquelleAutor der Antwort Alex Martelli
Ich bin dabei natürlich auf OpenCourseware, es ist toll. Sowieso, das ist, was ich getan habe. Ich nahm inspiration von adamse oben.
InformationsquelleAutor der Antwort tyler
Unter Berücksichtigung überlappender Ereignisse und die Erhaltung der ursprünglichen definition von MIT dies ist die einfacher und kompakter code, den ich bekommen kann.
code:
Ausgabe:
Keine Instanz von 'ggcc' in 'atgacatgcacaagtatgcat'
Anzahl der Instanzen von "atgc' in 'atgacatgcacaagtatgcat': 2
Anzahl der Instanzen von 'ana' in 'Banane': 2
InformationsquelleAutor der Antwort Ari Bj Rvnn
InformationsquelleAutor der Antwort leesto
Wie über dieses?
Ausgabe:
InformationsquelleAutor der Antwort Ryan Ginstrom
Nicht ungetestet ...
code:
Ausgabe:
Ich vermute, dass dies nur Unterhaltung oder Hausaufgaben ... rekursiven Funktion muss langsamer sein als die entsprechenden Python-iterative Lösung, die natürlich langsamer als mit
target.count(key)
... also ich habe nicht die Mühe gemacht, die bei der Behebung aller Probleme, die Ihre version hatte ... aber Lesen Sie PEP-008 🙂Kommentare auf string-Modul
Sie bemerkte, dass Sie versäumt hatte
from string import find
. Welche version von Python benutzt du? Was ist das Datum der letzten Aktualisierung auf das Buch oder ein tutorial, das Sie verwenden?Vom Anfang des string-Modul (es wird auf Ihrem computer als
<your Python install directory>/Lib/string.py
; ich zitiere aus der 2.6-version):"""Eine Sammlung von string-Operationen (die meisten werden nicht mehr verwendet).
Achtung: die meisten der code, den Sie hier sehen, ist in der Regel nicht verwendet heutzutage.
Beginnend mit Python 1.6, viele dieser Funktionen sind implementiert als
Methoden, die auf dem standard string-Objekt. Sie verwendet, um umgesetzt werden
ein built-in-Modul namens Streichriemen, aber Streichriemen ist nun obsolet selbst.
etc
"""
und hier ist diese Datei den code für die
find
Funktion (stripped Kommentare):also mit
string.find(target, key)
statttarget.find(key)
ist eine Verschwendung.InformationsquelleAutor der Antwort John Machin
Anderen Weg sein könnte, um einen Dritten optionalen parameter auf der
countSubStringMatchRecursive
Funktion namens count, die ursprünglich zu0
. So könnte man verfolgen, zählen. Dies würde aussetzen, die count-variable, um die Außenwelt, die vielleicht nicht wünschenswert, aber da es nicht schlimmer als deine Globale variable, die ich nicht glaube, es wäre ein problem in Ihrem Fall.Würden Sie auch haben um den code zu ändern, um die Letzte rekursive Aufruf der Aufruf, gibt der return-Anweisung an die Außenwelt. Siehe dieses Beispiel (ungetestet):
Edit: ich erkannte, dass, würden Sie brauchen einen vierten parameter, um der Lage sein, um die ursprüngliche Zeichenfolge Reisen entlang der Rekursion. Dies ist wahrscheinlich eine weniger als optimale Lösung und ich würde empfehlen, mit Greg Hewgill Lösung. Es hat eine saubere Trennung zwischen den Interaktionen mit der Außenwelt und die "business-Logik", so dass der code besser wiederverwendbar!
InformationsquelleAutor der Antwort adamse