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)");