Jaki jest najkrótszy sposób zdefiniowania anonimowej funkcji rekurencyjnej w Octave?

12

Uwielbiam programowanie funkcjonalne w Octave, ale w praktyce jest niewygodne. Zastanawiam się nad najkrótszym sposobem zdefiniowania anonimowej funkcji rekurencyjnej.

Mam kilka pomysłów, ale zastanawiam się, czy istnieje sposób na połączenie tych pomysłów, aby uczynić je jeszcze krótszymi (lub równie krótkimi, ale bardziej uniwersalnymi). Ze względu na to pytanie rekurencyjnie odliczajmy do zera (aby maksymalnie uprościć ładunek).

Jeśli moje rozumowanie jest prawidłowe, żadna z nazw zmiennych użytych w poniższych przykładach nie powinna się pokrywać. Pożądaną funkcją jest q(n), która zawsze powinna zwracać zero. ijest używana jako zmienna licznika, fjest funkcją rekurencyjną, którą wywołałem gw lokalnym zasięgu f.

44 bajty, „wbudowana definicja f

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

44 bajty, „definicja listy argumentów f

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

44 bajty, „osobna definicja f

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

41 bajtów, „pożądana funkcja jako wartość zwracana”

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

Obecny „zwycięzca” jest zainspirowany tą odpowiedzią flawr . Biorąc jednak pod uwagę szeroki zakres różnych sposobów, może ktoś pomyśli o jeszcze krótszej kombinacji metod.

Celem jest oczywiście uzyskanie go poniżej 39 bajtów dla „pełnej” funkcji. Wypróbuj online!

Sanchises
źródło

Odpowiedzi:

8

Oktawa , 39 bajtów

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

Wypróbuj online!

sufitowy
źródło
Wow, nie spodziewałem się, że można zdefiniować funkcję na jej własnej liście argumentów. Dobra robota!
Sanchises,