Refactoring rekursive "Vorkommen von" Funktion

def recursive_count(target, nested_num_list): # This code finds all occurrences of "target" in "nested_num_list" # Rewrite this code without a while/for loop that achieves # the same results. Basically using only recursive calls and if's. count = 0 i = 0 while i < len(nested_num_list): if nested_num_list[i] == target: count += 1 if type(nested_num_list[i]) == type([]): count += recursive_count(target, nested_num_list[i]) i += 1 return count 

Dies war eine Bonus-Frage (lesen Sie die Hashtags), die in meiner Berechnungsklasse kam. Ich habe versucht, Standard-Parameter, Basteln mit i und zählen zahlreiche Möglichkeiten, aber ich kann es nicht bekommen. Wie würdest du lieben Leute machen?

4 Solutions collect form web for “Refactoring rekursive "Vorkommen von" Funktion”

Hier ist ein weiterer Ansatz für Python 3 (das ist leicht übersetzt in Python 2). Keine Änderung der Eingabeparameter oder Verwendung anderer Funktionen (außer isinstance ):

 def recursive_count(target, nested_num_list): if nested_num_list == []: return 0 if isinstance(nested_num_list, int): return nested_num_list == target x, *y = nested_num_list # x, y = nested_num_list[0], nested_num_list[1:] # Python 2 return recursive_count(target, x) + recursive_count(target, y) >>> recursive_count(1, [1,2,3,[1,1,1],[1]]) 5 
 def recursive_count(target, nested_num_list): count = 0 # Make sure there's still stuff left. if len(nested_num_list) is 0: return 0 item = nested_num_list.pop(0) if type(item) == type([]): count += recursive_count(target, item) elif target == item: count += 1 count += recursive_count(target, nested_num_list) return count 

Wenn es Ihnen nichts ausmacht, die Eingabeparameter zu ändern, kannst du einfach das erste Element aus der Liste platzieren und es wieder zurückgeben. Bearbeiten: Die Verschachtelungsbehandlung hinzugefügt.

Ich würde einen rekursiven Flattener schreiben und seine Ausgabe nutzen.

 def flattener(left, right): try: res = reduce(flattener, right, left) except TypeError: left.append(right) res = left return res >>> nested_list = [[0], [1, [2, 3]], [4, 5], [6, [7], [8, 9]], 10, [[[[11]]]], [], 12] >>> flattened_list = reduce(flattener, nested_list, []) >>> flattened_list [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] Go on with flattened_list ... 

Edit: Also willst du eine einzige Funktion, die das tut, und hier ist eine Version ohne isinstance oder explizite Längenprüfung oder Indizierung und mit nur einem inline- if :

 def countin(seq, predicate): try: iterseq = iter(seq) except TypeError: return 1 if predicate(seq) else 0 try: head = iterseq.next() except StopIteration: return 0 c = countin(head, predicate) c += countin(iterseq, predicate) return c >>> count_in(nested_list, lambda x: x % 2 == 0) # count all even numbers 7 >>> len(filter(lambda x: x % 2 == 0, reduce(flattener, nested_list, []))) 7 
 def recursive_count(target, nested_num_list): return (recursive_count(nested_num_list[1:]) + (target == nested_num_list[0])) if nested_num_list else 0 
  • Python-Rekursions- und return-Anweisungen
  • Maximales Niveau der Rekursion in Python
  • Rekursive Funktion, die keine zurückgibt?
  • Python rekursiv anhängen Liste Funktion
  • Trennungsliste mit Rekursion
  • Berechnungsdeterminante einer Matrix (nxn) rekursiv
  • N-Queen-Backtracking in Python: Wie gibt man Lösungen zurück, anstatt sie zu drucken?
  • Rekursionsfunktion in Python
  • Python-interpretator automatisch wiederherzustellen, ohne Antwort zurückzugeben
  • Gibt es eine Möglichkeit, eine rekursive Funktion zu schreiben, die alle ganzen Zahlen in einer Liste durchsucht und sieht, ob irgendwelche zwei gleich einer negativen Summe sind?
  • Python Recursive Funktion für Collatz Conjecture
  • Python ist die beste Programmiersprache der Welt.