読者です 読者をやめる 読者になる 読者になる

VBAHaskellでのコラッツ数列

VBA

コラッツの問題 - Wikipedia

「任意の正の整数 n をとり、
   ・ n が偶数の場合、n を 2 で割る
   ・ n が奇数の場合、n に 3 をかけて 1 を足す
という操作を繰り返すと、どうなるか」

素直にファンクタを作れる。(長いけど)
collatz = p_if_else(, Array(p_mod(, 2), p_plus(1, p_mult(3)), p_divide(, 2)))
             '  Array(条件式, 非0の場合の変換式, 0の場合の変換式)

' 3からスタートする
printM  generate_while(3, p_notEqual(1), collatz )
3 10 5 16 8 4 2 1

' 27からスタートすると111ステップに及び、途中で9232 にまで増大する
collatz27 = 
generate_while(27, p_notEqual(1), collatz)
printM  collatz27
  27  82  41  124  62  31  94  47  142  71  214  107  322  161  484  242  121  364  182  91  274  137  412  206  103  310  155  466  233  700  350  175  526  263  790  395  1186  593  1780  890  445  1336  668  334  167  502  251  754  377  1132  566  283  850  425  1276  638  319  958  479  1438  719  2158  1079  3238  1619  4858  2429  7288  3644  1822  911  2734  1367  4102  2051  6154  3077  9232  4616  2308  1154  577  1732  866  433  1300  650  325  976  488  244  122  61  184  92  46  23  70  35  106  53  160  80  40  20  10  5  16  8  4  2  1

printS  collatz27
[Dim1]: 0 -> 111 : Total Size = 112

' 最大値の計算は foldl1 の引数に p_max を与える
foldl1(p_max, collatz27)
 9232

' 最大値の位置
find_pred(p_equal(9232), collatz27)
 77

' その近辺を表示
printM subM(m, iota(74, 80))
  2051  6154  3077  9232  4616  2308  1154