Mit Rekursion wie in der Antwort von @aleksei-astynax-pirogov wird ein Rekursionsfehler auftreten, wenn Sie zu viele Iterationen haben. Sie können stattdessen den Seiteneffekt des Zustands innerhalb einer Funktion verbergen.
def fp_while(pred, fun, acc):
v = acc
while(pred(v)):
v = fun(v)
return v
Verwendungsbeispiel:
fp_while(lambda x: x < 5, lambda x: x + 1, 1)
print(fp_while(lambda x: x < 5, lambda x: x + 1, 1))
# gibt 5 aus
Verwendung des Generatorenansatzes
Der folgende Generatorenansatz ermöglicht es Ihnen, den Zustand bei jeder Iteration zu speichern
def fp_while_generator(pred, fun, acc):
v = acc
while(pred(v)):
yield v
v = fun(v)
yield v # entfernen Sie dies, wenn Sie den letzten Wert, der die Überprüfung nicht besteht, nicht möchten
Verwendungsbeispiel:
my_while_generator = fp_while_generator(lambda x: x < 5, lambda x: x + 1, 1)
print([i for i in my_while_generator])
# gibt [1,2,3,4,5] aus
Weitere Informationen zu Generatoren https://realpython.com/introduction-to-python-generators/
2 Stimmen
Aus Neugierde, was ist der Sinn dieser Übung?
21 Stimmen
Wer braucht einen Punkt für so etwas? Er lernt und experimentiert, was großartig ist.
1 Stimmen
Ich denke, du brauchst
lambda i=i: ...
. Derzeit wird nur überprüft, obi<5
, wenn du das Lambda initialisierst.0 Stimmen
@SomeKittens Deshalb sagte er aus Neugier.
1 Stimmen
Um... For-Schleifen und While-Schleifen sind per Definition nicht im funktionalen Programmierstil. Sie führen beide wiederholt Anweisungen aus, was nur nützlich ist, wenn diese Anweisungen Nebeneffekte verursachen, die außerhalb der Schleife sichtbar sind. Die Essenz des funktionalen Stils besteht darin, Berechnungen zu vermeiden, die Nebeneffekte verwenden, um ihre Ergebnisse zu kommunizieren.
8 Stimmen
Wie ist dieser "funktionale Programmierstil"? Wegen Rekursion? Du erhöhst immer noch veränderliche Variablen in einer Schleife. Ein FP-Ansatz würde auf Induktion über die Struktur Ihrer Sequenz basieren...
3 Stimmen
@John, FP-Stil verwendet keine Schleifen:) Es verwendet map/filter/reduce:) Und verwendet niemals globale Variablen!!!
0 Stimmen
Ich habe gerade ibm.com/developerworks/library/l-prog/index.html durchgesehen.