JSFiddle - React, Tailwind, and code Playground

by dvjc

HTML

<div>Collatz!</div>
<div>Which starting number, under one million, produces the longest chain?</div>
<div>Usage: <a href="http://projecteuler.net/problem=14" id="problemLink" target="_blank">Project Euler (14)</a></div>
<div id="divResult"></div>
<hr/>
<div id="divValue"></div>

JavaScript

document.getElementById('divValue').innerText = longestPathSeed(1000000);

// even: return half
// odd: triple and add one
function collatz(n){
    return ( (n%2) === 0 ) ? (n/2) : (3*n+1) ;
}

// n=1? no need to do anything
// otherwise find collatz for n
// and recursively update m until n is 1
function pathLength(n, m){
    var p = 1;
    if( n == 1 ){
        p = m;
    } else {
        var n2 = collatz(n);
        p = pathLength(n2, m+1);
    }
    return p;
}

function longestPathSeed(n){
    var longest = -1;
    var seed = -1;
    for( var i = 1; i <=n; i++ ){
        var p = pathLength( i, 1 );
        if( longest < p ){
            longest = p;
            seed = i;
        }
    }
    return seed;
}