¿Cuál es la forma más corta de definir una función recursiva anónima en Octave?

12

Me encanta la programación funcional en Octave, pero es bastante difícil de manejar en la práctica. Me pregunto cuál es la forma más corta de definir una función recursiva anónima.

Tengo algunas ideas, pero me pregunto si hay una manera de combinar estas ideas para hacerlas aún más cortas (o igualmente cortas pero más versátiles). En aras de esta pregunta, hagamos una cuenta regresiva recursiva a cero (solo para mantener la carga lo más simple posible).

Si mi razonamiento es correcto, ninguno de los nombres de variables que utilicé en los siguientes ejemplos debería superponerse. La función deseada es q(n), que siempre debe devolver cero. ise utiliza como una variable de contador, fes la función recursiva que he llamado gen el ámbito local de f.

44 bytes, "definición en línea de f"

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

44 bytes, "definición de lista de argumentos de f"

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

44 bytes, "definición separada de f"

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

41 bytes, "función deseada como valor de retorno"

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

El actual 'ganador' está inspirado en esta respuesta de flawr . Sin embargo, dada la gran variedad de formas diferentes de hacer esto, tal vez alguien pueda pensar en una combinación aún más corta de métodos.

El objetivo es, por supuesto, que sea inferior a 39 bytes para una función "completa". ¡ Pruébelo en línea!

Sanchises
fuente

Respuestas:

8

Octava , 39 bytes

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

Pruébalo en línea!

techo
fuente
Vaya, no esperaba que pudieras definir una función en su propia lista de argumentos. ¡Bien hecho!
Sanchises