Qual é a maneira mais curta de definir uma função recursiva anônima no Octave?

12

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 gno 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!

Sanchises
fonte

Respostas:

8

Oitava , 39 bytes

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

Experimente online!

teto
fonte
Uau, eu não esperava que você pudesse definir uma função em sua própria lista de argumentos. Bem feito!
Sanchises