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. i
se utiliza como una variable de contador, f
es la función recursiva que he llamado g
en 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!