working neco
Haskellの勉強がてら コラッツ予想に取り組んでいます。
ご存知の方も多いと思いますが 自然数において
奇数の場合は 3倍して 1を足す
偶数の場合は 2で割る を繰り返すと
1に収束するという予想です。
上記の条件を 奇数の場合に 3倍して 1を引く とした場合には
1に収束しなくなり 下記のプログラムでは 止まらなくなります。
発散する場合は仕方ありませんが 1以外で収束する場合に 止まるようにしたいと考えています。
数列が 例えば [2, 3, 4, 5] まで形成され 次の数字が 今までに出現した数字の場合
(左記の場合は 2 3 4 5 のいずれか)になった場合に停止するように プログラムしたいのですが
どうにもうまくいきません。
御指導いただければ助かります。
よろしくお願いします。
import Data.Char
import Data.List
type Nat = Integer
collatz :: Nat -> Nat
collatz n
| odd n = 3 * n + 1
| even n = div n 2
sequence :: Nat -> [Nat]
sequence n
| n == 1 = 1 : []
| otherwise = n : sequence (collatz n)
ご存知の方も多いと思いますが 自然数において
奇数の場合は 3倍して 1を足す
偶数の場合は 2で割る を繰り返すと
1に収束するという予想です。
上記の条件を 奇数の場合に 3倍して 1を引く とした場合には
1に収束しなくなり 下記のプログラムでは 止まらなくなります。
発散する場合は仕方ありませんが 1以外で収束する場合に 止まるようにしたいと考えています。
数列が 例えば [2, 3, 4, 5] まで形成され 次の数字が 今までに出現した数字の場合
(左記の場合は 2 3 4 5 のいずれか)になった場合に停止するように プログラムしたいのですが
どうにもうまくいきません。
御指導いただければ助かります。
よろしくお願いします。
import Data.Char
import Data.List
type Nat = Integer
collatz :: Nat -> Nat
collatz n
| odd n = 3 * n + 1
| even n = div n 2
sequence :: Nat -> [Nat]
sequence n
| n == 1 = 1 : []
| otherwise = n : sequence (collatz n)