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. i
jest używana jako zmienna licznika, f
jest funkcją rekurencyjną, którą wywołałem g
w 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!