コラッツです。再帰でメモ化するだけですね。ふつうに配列を使ってます。
7分あまりかかりました。
function fold($f, $init) {
begin { $x = $init }
process { $x = & $f $x $_ }
end { $x }
}
function Collatz($n) {
if($n -ge $M -or $a[$n] -lt 0) {
if($n % 2 -eq 0) { $p = $n / 2 } else { $p = $n * 3 + 1 }
$l = 1 + (Collatz $p)
if($n -le $M) {
$a[$n] = $l
}
$l
}
else {
$a[$n]
}
}
function max($x1, $x2) {
$m1, $n1 = $x1
$m2, $n2 = $x2
if($m1 -gt $m2) { $x1 } else { $x2 }
}
$watch = New-Object System.Diagnostics.Stopwatch
$watch.Start();
$M = 1000000
$a = 0..(-$M)
$a[1] = 1
($M/2+1)..$M | foreach { ,((Collatz $_), $_) } | fold { max $args[0] $args[1] } (0, 0)
$watch.Stop();
$watch.Elapsed.TotalMilliSeconds / 1000