Quel est le moyen le plus court pour définir une fonction récursive anonyme dans Octave?

12

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. iest utilisé comme variable de compteur, fest la fonction récursive que j'ai appelée gdans 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!

Sanchises
la source

Réponses:

8

Octave , 39 octets

q=f(f=@(g)@(n){@()g(g)(n-1),n}{~n+1}())

Essayez-le en ligne!

plafond
la source
Wow, je ne m'attendais pas à ce que vous puissiez définir une fonction dans sa propre liste d'arguments. Bien joué!
Sanchises