Octave'da fonksiyonel programlamayı seviyorum, ancak pratikte oldukça hantal. Anonim bir özyinelemeli işlev tanımlamanın en kısa yolunu merak ediyorum.
Bazı fikirlerim var, ama bu fikirleri daha kısa (veya eşit derecede kısa ama çok yönlü) yapmak için birleştirmenin bir yolu olup olmadığını merak ediyorum. Bu soru uğruna, tekrar tekrar sıfıra geri sayalım (sadece yükü mümkün olduğunca basit tutmak için).
Akıl yürütmem doğruysa, aşağıdaki örneklerde kullandığım değişken adlarının hiçbiri çakışmamalıdır. İstenen işlev, q(n)
her zaman sıfır döndürmelidir. i
bir sayaç değişkeni olarak kullanılır , yerel kapsamda f
çağırdığım özyinelemeli işlevdir .g
f
44 bayt, "satır içi tanımı f
"
q=@(n)(f=@(g,i){@()g(g,i-1),i}{~i+1}())(f,n)
44 bayt, "argüman listesi tanımı f
"
q=@(n,f=@(g,i){@()g(g,i-1),i}{~i+1}())f(f,n)
44 bayt, "ayrı tanımı f
"
f=@(i,g){@()g(i-1,g),i}{~i+1}();q=@(n)f(n,f)
41 bayt, "dönüş değeri olarak istenen işlev"
f=@(g)@(n){@()g(g)(n-1),n}{~n+1}();q=f(f)
Mevcut 'kazanan' bu cevaptan kusurlu olarak esinlenmiştir . Bununla birlikte, bunu yapmak için çok çeşitli farklı yollar göz önüne alındığında, belki de biri daha kısa bir yöntem kombinasyonu düşünebilir.
Amaç tabii ki bir "tam" işlevi için 39 bayt altına almak için, çevrimiçi deneyin!