&gt; Recursion in computer software requires nested definitions that eventually reach a simple base case resulting in termination.<p>I think you&#x27;ve just illustrated the article&#x27;s point.<p>You&#x27;re describing well-founded recursion, which is very useful, but doesn&#x27;t include e.g. continuation-passing ( <a href="https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Continuation-passing_style" rel="nofollow">https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Continuation-passing_style</a> ) or co-recursion ( <a href="https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Corecursion" rel="nofollow">https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Corecursion</a> ), hence perpetuating the myths the article is complaining about.<p>The really unfortunate thing is that sub-sets of these ideas keep getting re-invented (AKA &quot;reinventing the square wheel&quot;), for example exception handlers in place of continuations, iterable objects in place of co-recursive data, etc.<p>As for J&#x2F;K flip-flops, they&#x27;re recursive because their output is their own input. For example, given co-inductive stream of `j` and `k` values (the flip-flop inputs), we can generate a co-inductive stream of outputs `q`:<p><pre><code>    function flipflop(init_js, init_ks) {
      function ff(js, ks, q_old) {
        var j     = car(js);
        var k     = car(ks);
        var q_new = j * not(q_old) + not(k) * q_old;
        return cons(q, ff(cdr(js), cdr(ks), q_new);
      }
      return ff(init_js, init_ks, 0);  &#x2F;&#x2F; Initiate the co-recursion with 0, arbitrarily
    }
</code></pre>
Whilst I&#x27;ve used co-recursive data for convenience, the fact that the result `q_new` becomes the argument `q_old` for the next call is unavoidably recursive.