(function() {
  var Hofstadter;

  // Hofstadter's chaotic function Q
  // computed using a dynamic programming
  function q(n) {
    var A = [],
        i;

    A[0] = 0
    A[1] = 1;
    A[2] = 1;

    for (i = 3; i <= n; i++) {
      A[i] = A[i - A[i - 1]] + A[i - A[i - 2]];
    }

    return A[n];
  }

  Hofstadter = {};
  Hofstadter.function = {};
  Hofstadter.function.Q = q;

  d3.Hofstadter = Hofstadter;
})();