Adoro programação funcional no Octave, mas na prática é bastante complicado. Eu estou pensando sobre a maneira mais curta de definir uma função recursiva anônima.
Eu tenho algumas idéias, mas estou me perguntando se existe uma maneira de combiná-las para torná-las ainda mais curtas (ou igualmente curtas, mas mais versáteis). Para o propósito desta pergunta, vamos recursivamente contar até zero (apenas para manter a carga útil o mais simples possível).
Se meu raciocínio estiver correto, nenhum dos nomes de variáveis que usei nos exemplos a seguir deve se sobrepor. A função desejada é q(n)
, que deve sempre retornar zero. i
é usado como uma variável de contador, f
é a função recursiva que chamei g
no escopo local de f
.
44 bytes, "definição embutida de f
"
q=@(n)(f=@(g,i){@()g(g,i-1),i}{~i+1}())(f,n)
44 bytes, "definição da lista de argumentos de f
"
q=@(n,f=@(g,i){@()g(g,i-1),i}{~i+1}())f(f,n)
44 bytes, "definição separada de f
"
f=@(i,g){@()g(i-1,g),i}{~i+1}();q=@(n)f(n,f)
41 bytes, "função desejada como valor de retorno"
f=@(g)@(n){@()g(g)(n-1),n}{~n+1}();q=f(f)
O atual 'vencedor' é inspirado nesta resposta por flawr . No entanto, dada a grande variedade de maneiras diferentes de fazer isso, talvez alguém possa pensar em uma combinação ainda mais curta de métodos.
Obviamente, o objetivo é obtê-lo abaixo de 39 bytes para uma função "completa", Experimente online!