J'adore la programmation fonctionnelle dans Octave, mais c'est plutôt lourd en pratique. Je me demande quel est le moyen le plus court de définir une fonction récursive anonyme.
J'ai quelques idées, mais je me demande s'il existe un moyen de combiner ces idées pour les rendre encore plus courtes (ou tout aussi courtes mais plus polyvalentes). Pour cette question, comptons récursivement jusqu'à zéro (juste pour garder la charge utile aussi simple que possible).
Si mon raisonnement est correct, aucun des noms de variables que j'ai utilisés dans les exemples suivants ne doit se chevaucher. La fonction souhaitée est q(n)
, qui doit toujours retourner zéro. i
est utilisé comme variable de compteur, f
est la fonction récursive que j'ai appelée g
dans la portée locale de f
.
44 octets, "définition en ligne de f
"
q=@(n)(f=@(g,i){@()g(g,i-1),i}{~i+1}())(f,n)
44 octets, "définition de la liste d'arguments de f
"
q=@(n,f=@(g,i){@()g(g,i-1),i}{~i+1}())f(f,n)
44 octets, "définition distincte de f
"
f=@(i,g){@()g(i-1,g),i}{~i+1}();q=@(n)f(n,f)
41 octets, "fonction souhaitée comme valeur de retour"
f=@(g)@(n){@()g(g)(n-1),n}{~n+1}();q=f(f)
Le «gagnant» actuel s'inspire de cette réponse de flawr . Cependant, étant donné le large éventail de façons différentes de le faire, peut-être que quelqu'un peut penser à une combinaison encore plus courte de méthodes.
Le but est bien sûr de le faire descendre en dessous de 39 octets pour une fonction "full", essayez-le en ligne!