Ackermann's function

Visualizing recursion

HTML

<p>m: <input id="m"/> n: <input id="n"/> <button id="go"> go </button></p><br/>
<div id="output"></div>

<script>
    var b_in = document.getElementById('go');
    var m_in = document.getElementById('m');
    var n_in = document.getElementById('n');
    var t = document.getElementById('output');
    var b = document.body;
</script>

CSS

#output { 
    width:80%; height:6em; overflow-y:scroll; 
    border:1px solid black;
    padding:3pt; font-family:monospace;
}

JavaScript

/*
A(0, n) = n + 1 for n ≥ 0
A(m, 0) = A(m − 1, 1) for m > 0
A(m, n) = A(m − 1, A(m, n − 1)) for m, n > 0
*/

b_in.onclick = function() {
    var m = parseInt(m_in.value);
    var n = parseInt(n_in.value);
    clear();
    print(A(m, n));
}
function print(s) {
    t.innerHTML += s + '<br/>';
}
function clear() {
    depth = 0;
    t.innerHTML = "";
}

var depth = 0;
function A(m, n) {
    if ( ++depth > 500) return;
    if (m == 0 && n >= 0) res = n + 1;
    if (n == 0 && m > 0) res = A(m - 1, 1);
    if (m > 0 && n > 0) res = A(m - 1, A(m, n - 1));
    print("A(" + m + ", " + n + ") = " + res);
    return res;
}


print ("A(0, 0)-A(0, 30)");
print ("A(1, 0)-A(1, 14)");
print ("A(2, 0)-A(2, 07)");