Qual è il modo più breve per definire una funzione ricorsiva anonima in Octave?


12

Adoro la programmazione funzionale in Octave, ma è piuttosto ingombrante nella pratica. Mi chiedo quale sia il modo più breve per definire una funzione ricorsiva anonima.

Ho alcune idee, ma mi chiedo se c'è un modo per combinare queste idee per renderle ancora più brevi (o ugualmente brevi ma più versatili). Per ragioni di questa domanda, contiamo ricorsivamente fino a zero (solo per mantenere il payload il più semplice possibile).

Se il mio ragionamento è corretto, nessuno dei nomi delle variabili che ho usato nei seguenti esempi dovrebbe sovrapporsi. La funzione desiderata è q(n), che dovrebbe sempre restituire zero. iviene usato come variabile contatore, fè la funzione ricorsiva che ho chiamato gnell'ambito locale di f.

44 byte, "definizione inline di f"

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

44 byte, "definizione elenco argomenti di f"

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

44 byte, "definizione separata di f"

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

41 byte, "funzione desiderata come valore di ritorno"

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

L'attuale "vincitore" si ispira a questa risposta di Flawr . Tuttavia, data la vasta gamma di modi diversi per farlo, forse qualcuno può pensare a una combinazione di metodi ancora più breve.

L'obiettivo è ovviamente quello di portarlo sotto i 39 byte per una funzione "completa", provalo online!

Risposte:


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.