Функція Ackermann примітна тим, що є одним з найпростіших прикладів загальної, обчислюваної функції, яка не є примітивною рекурсивною.
Ми будемо використовувати визначення A(m,n)
взяття у двох негативних цілих числах, де
A(0,n) = n+1
A(m,0) = A(m-1,1)
A(m,n) = A(m-1,A(m,n-1))
Ви можете реалізувати
- названа або анонімна функція, яка приймає два цілі числа як вхідні дані, повертаючи ціле число, або
- програма, що приймає два цілих цілих чисел, розділених пробілом або новим рядком на STDIN, друкуючи результат на STDOUT.
Ви не можете використовувати функцію Ackermann або функцію гіперекспоненціації з бібліотеки, якщо така існує, але ви можете використовувати будь-яку іншу функцію з будь-якої іншої бібліотеки. Допускається регулярне експонування.
Ваша функція повинна вміти знаходити значення A(m,n)
для m ≤ 3 та n ≤ 10 менше ніж за хвилину. Він повинен хоча б теоретично закінчуватися на будь-яких інших входах: якщо враховувати нескінченний простір стеків, нативний тип Bigint та довільно тривалий проміжок часу, він би повернув відповідь. Редагувати: Якщо у вашій мові є занадто обмежувальна глибина рекурсії за замовчуванням, ви можете переналаштувати її без витрат на символи.
Виграє подання з найменшою кількістю символів.
Ось деякі значення для перевірки вашої відповіді:
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)
і вище наївно, як це робили інші? Чи потрібно мені придумати нерекурсійне рішення, чи я можу також просто "припускати нескінченний простір" у цих випадках? Я досить впевнений, це закінчиться протягом хвилини.