Ackermann işlevi, ilkel özyinelemeli olmayan, toplam, hesaplanabilir bir işlevin en basit örneklerinden biri olması nedeniyle dikkate değerdir.
A(m,n)
İki negatif olmayan tamsayı alma tanımını kullanacağız.
A(0,n) = n+1
A(m,0) = A(m-1,1)
A(m,n) = A(m-1,A(m,n-1))
Uygulayabilirsiniz
- giriş olarak iki tam sayı alan, bir tam sayı döndüren adlandırılmış veya adsız bir işlev veya
- STDIN'de iki satır veya yeni satırla ayrılmış tam sayı alan ve STDOUT'a bir sonuç yazdıran bir program.
Varsa, bir kütüphaneden Ackermann işlevini ya da hiperxponentiation işlevini kullanamazsınız, ancak başka herhangi bir kütüphaneden başka bir işlev kullanabilirsiniz. Düzenli üstelleştirmeye izin verilir.
İşleviniz A(m,n)
, m ≤ 3 ve n ≤ 10 değerlerini bir dakikadan daha kısa bir sürede bulabilmelidir . En azından diğer girdilerde teorik olarak sonlandırılmalıdır: sonsuz yığın alanı, yerel bir Bigint tipi ve keyfi olarak uzun bir süre için, cevabı geri getirecektir. Düzenleme: Diliniz çok kısıtlayıcı olan varsayılan bir özyineleme derinliğine sahipse, bunu karakter maliyeti olmadan yeniden yapılandırabilirsiniz.
En kısa sayıda karakter içeren gönderim kazanır.
İşte cevabınızı kontrol etmek için bazı değerler:
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)
diğerlerinin yaptığı gibi naif bir şekilde hesaplama yapmak için çok düşükse ne olur? Özyinelemesiz bir çözüm bulmak zorunda mıyım, yoksa bu durumlarda sadece "sonsuz yığın alanı üstlenebilir" mi? Oldukça eminim, bir dakika içinde sona erecek.