Octave'de anonim bir özyinelemeli işlev tanımlamanın en kısa yolu nedir?


12

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. ibir sayaç değişkeni olarak kullanılır , yerel kapsamda fçağırdığım özyinelemeli işlevdir .gf

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!

Yanıtlar:


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.