Article référencé: [Commentaires sur Essayer de supprimer les effets secondaires et les affectations dans le problème Fizz Buzz [JavaScript, VB.Net, Python3, CommonLisp, Clojure, HSP, langage R] / 543eed9386103ec9c58c # comment-7f730579d0e5e1267525) Une doublure en Python: récursif Vous n'avez pas besoin de créer un combinateur Y compliqué, vous avez juste besoin que la fonction ait un argument qui se reçoit.
Je pensais que je ne pouvais pas écrire de récursion en lambda (à moins d'avoir fait quelque chose de spécial), mais je le peux. Je ne savais pas ça. Non, je pense que je passais par mon cerveau parce que je ne pouvais pas le comprendre même si je le lisais.
J'ai écrit moi-même le revêtement de sol en me référant à l'article.
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
#résultat
3628800 3628800
Il fait la même chose que la fonction supérieure `f``` et la fonction inférieure` `f2
`.
Le supérieur est normalement récursif. Je fais généralement cela et je comprends.
Et le fond, c'est un peu difficile ...
Avez-vous l'impression de créer une fonction qui renvoie le multiplicateur avec une récursivité anonyme et de la nommer f2?
Je ne sais pas ce que c'est ... mais il peut être converti mécaniquement de haut en bas, donc c'est tout à fait le cas lorsque vous en avez besoin.
Veuillez commenter si c'est différent ou quelque chose comme ça.
Article de référence: [Python] Recursive with lambda
Avec des arguments de mots clés ...
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 )
)
Nettoyer. D'une manière ou d'une autre, le sens est facile à comprendre. J'ai beaucoup appris.
Recommended Posts