コラッツ列を生成してみる

はいどーもコラッタのニートです。
『すごいHaskellたのしく学ぼう』に「長さ15以上のコラッツ列の開始数になるものの数」を求める方法が書いていました。
で、本日はコラッツ列をC#とJavaScriptで生成してみようと、そういうわけなんですね。

注*ただの再帰処理の練習です。

コラッツ列ってなんやねん

『すごいhaskellたのしく学ぼう』によれば、コラッツの数列は次のように定義されているらしいです。

・任意の自然数から開始する
・数が1ならば、終了
・数が偶数なら、2で割る
・数が奇数なら、3倍して1を足す
・新しい値でこのアルゴリズムを繰り返す

『すごいHaskellたのしく学ぼう』のサンプルコードはHaskellで書かれていましたが(当然と言えば当然ですが)、この記事ではC#とJavaScriptで実装してみたいと思います。

数列を生成する

なにはともあれ、まずは数列を生成しなければなりません。
Haskellのサンプルコードはこんな感じでした。

結果はこんな感じ。

いわゆる再帰処理をしていますね(Haskellはループ構文がないそうです)。

C#で素直に書くなら、こんな感じでしょうか。

ご覧の通りwhileループを使っており、再帰処理はしていません。
再帰処理を使うならこんな感じでしょうか。

JavaScriptだとこうでしょうか。

どれも同じ結果が得られます。

注*なお負の数を与えた場合はバグります。その辺の処理も色々入れてみたいんですが、僕は数学まったくできないマンなので、ちゃんとした条件がわからずこのままにしています。

コラッツ列の長さが15以上のものを抽出

先ほど作成した関数(メソッド)の結果を用いて、長さが15以上のものを抽出することができます。
すごいH本の問題である「1から100までの数のうち、長さ15以上のコラッツ列の開始数になるものはいくつあるか?」は以下のような感じで求めることができます。

あとはC#ならToListにしてCountを取ったり、JavaScriptならlengthプロパティを取得したりでいけます。

終わりに

Haskellではループを書けないらしく、再帰処理でループを表現する必要があります。
数学できないマンの僕にはこれが非常に難しかったので、練習がてら他の言語でも挑戦してみた感じです。
Haskellは僕にはちょっと使いこなせないかもしれませんねえ……。
でも関数型プログラミングのアレコレを知りたいので、ひとまずすごいH本は通読したいと思いますよ。

ほなそんな感じでまた。

フォローする