Fungsi Ackermann terkenal karena menjadi salah satu contoh paling sederhana dari total, fungsi yang dapat dihitung yang bukan rekursif primitif.
Kami akan menggunakan definisi A(m,n)
mengambil dua bilangan bulat tidak negatif di mana
A(0,n) = n+1
A(m,0) = A(m-1,1)
A(m,n) = A(m-1,A(m,n-1))
Anda dapat menerapkan
- fungsi bernama atau anonim mengambil dua bilangan bulat sebagai input, mengembalikan bilangan bulat, atau
- sebuah program mengambil dua bilangan bulat yang dipisahkan spasi atau baris baru pada STDIN, mencetak hasilnya ke STDOUT.
Anda tidak boleh menggunakan fungsi Ackermann atau fungsi hyperexponentiation dari perpustakaan, jika ada, tetapi Anda dapat menggunakan fungsi lain dari perpustakaan lain. Eksponen reguler diperbolehkan.
Fungsi Anda harus dapat menemukan nilai A(m,n)
untuk m ≤ 3 dan n ≤ 10 dalam waktu kurang dari satu menit. Setidaknya harus diakhiri secara teoritis pada input lain: diberi ruang stack tak terbatas, tipe Bigint asli, dan periode waktu yang lama secara sewenang-wenang, itu akan mengembalikan jawabannya. Sunting: Jika bahasa Anda memiliki kedalaman rekursi default yang terlalu ketat, Anda dapat mengonfigurasi ulang tanpa biaya karakter.
Pengajuan dengan jumlah karakter terpendek akan menang.
Berikut ini beberapa nilai, untuk memeriksa jawaban Anda:
A | n=0 1 2 3 4 5 6 7 8 9 10
-----+-----------------------------------------------------------------
m=0 | 1 2 3 4 5 6 7 8 9 10 11
1 | 2 3 4 5 6 7 8 9 10 11 12
2 | 3 5 7 9 11 13 15 17 19 21 23
3 | 5 13 29 61 125 253 509 1021 2045 4093 8189
4 | 13 65533 big really big...
A(3,8)
dan di atas sama naifnya dengan yang lain? Apakah saya harus datang dengan solusi non-rekursi, atau bisakah saya juga "mengasumsikan ruang stack tak terbatas" dalam kasus ini? Saya cukup yakin, itu akan berakhir dalam satu menit.