Referenzierter Artikel: [Kommentare zu Versuch, Nebenwirkungen und Zuweisungen im Fizz Buzz-Problem zu unterdrücken [JavaScript, VB.Net, Python3, CommonLisp, Clojure, HSP, R-Sprache] / 543eed9386103ec9c58c # comment-7f730579d0e5e1267525) Ein Liner in Python: Rekursiv Sie müssen keinen komplizierten Y-Kombinator erstellen, sondern nur die Funktion, um ein Argument zu erhalten, das sich selbst empfängt.
Ich dachte, ich könnte keine Rekursion in Lambda schreiben (es sei denn, ich hätte etwas Besonderes gemacht), aber ich kann. Das wusste ich nicht. Nein, ich glaube, ich bin früher durch mein Gehirn gegangen, weil ich es nicht verstehen konnte, selbst wenn ich es gelesen habe.
Ich habe den Boden selbst unter Bezugnahme auf den Artikel geschrieben.
do = pack_to_tuple = lambda *x : x
case = unpack_and_evaluate_in_order_then_return_last = lambda x : x[-1]
otherwise = True
f = ( lambda x :
case( x == 0 and do( 1 )
or otherwise and do( x * f( x - 1 ) )
)
)
f2 = ( lambda x :
( lambda f : f( f, x ) ) ( lambda f, x :
case( x == 0 and do( 1 )
or otherwise and do( x * f(f, x - 1 ) )
)
)
)
print(f(10), f2(10))
python
#Ergebnis
3628800 3628800
Es macht dasselbe wie die obere Funktion `f``` und die untere Funktion`
f2` ``.
Der obere ist normalerweise rekursiv. Normalerweise mache ich das und verstehe.
Was ist mit dem Boden? Es ist ein wenig schwierig ...
Haben Sie das Gefühl, Sie erstellen eine Funktion, die den Multiplikator mit anonymer Rekursion zurückgibt und ihn f2 nennt?
Ich weiß nicht, was es ist ... aber es kann mechanisch von oben nach unten konvertiert werden, also ist es ganz so, wenn Sie es brauchen.
Bitte kommentieren Sie, ob es anders ist oder so.
Referenzartikel: [Python] Rekursiv mit Lambda
Mit Schlüsselwortargumenten ...
python
f3 = ( lambda x, f = lambda f, x : case( x == 0 and do( 1 )
or otherwise and do( x * f(f, x - 1 ) )
)
: f( f, x )
)
Sauber. Irgendwie ist die Bedeutung leicht zu verstehen. Ich habe viel gelernt.
Recommended Posts