Apa cara terpendek untuk mendefinisikan fungsi rekursif anonim di Oktaf?


12

Saya suka pemrograman fungsional dalam Oktaf, tetapi dalam praktiknya agak sulit. Saya bertanya-tanya tentang cara terpendek untuk mendefinisikan fungsi rekursif anonim.

Saya punya beberapa ide, tapi saya bertanya-tanya apakah ada cara untuk menggabungkan ide-ide ini untuk membuatnya lebih pendek (atau sama pendek tapi lebih fleksibel). Demi pertanyaan ini, mari kita menghitung mundur secara nol ke nol (hanya untuk menjaga muatan sesederhana mungkin).

Jika alasan saya benar, tidak ada nama variabel yang saya gunakan dalam contoh berikut ini yang akan tumpang tindih. Fungsi yang diinginkan adalah q(n), yang harus selalu mengembalikan nol. idigunakan sebagai variabel counter, fadalah fungsi rekursif yang saya sebut gdalam lingkup lokal f.

44 byte, "definisi sebaris f"

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

44 byte, "definisi daftar argumen f"

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

44 byte, "pisahkan definisi f"

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

41 byte, "fungsi yang diinginkan sebagai nilai balik"

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

'Pemenang' saat ini terinspirasi oleh jawaban ini oleh flawr . Namun, mengingat berbagai macam cara untuk melakukan ini, mungkin seseorang dapat memikirkan kombinasi metode yang lebih pendek.

Tujuannya tentu saja untuk mendapatkannya di bawah 39 byte untuk fungsi "penuh", Coba online!

Jawaban:


8

Oktaf , 39 byte

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

Cobalah online!


Wow, saya tidak berharap Anda bisa mendefinisikan fungsi dalam daftar argumennya sendiri. Sudah selesai dilakukan dengan baik!
Sanchises
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.