Collatz 予想の無限リスト使うやつ
http://ll.jus.or.jp/2006/blog/doukaku2
無限リストは,それより若い位置の要素を使って求めるもんだと思ってたけど
そうでもないのか.それ以前に求まっている要素ならどこでもいいのかな.
zipWith' fromMaybe ...
http://www.kmonos.net/wlog/63.html#_1701060713
例えば稲葉さんのコードだと次みたいに求まっていく.
パターンマッチ実装の zipWith じゃなくて head, tail 実装の zipWith' にしてるのはなんでだろ.
後の要素を求める前にパターンマッチしようとしちゃうからなのかな.
確かにzipWithだとスタックオーバーフローで落ちる.どういうことだろん….
# g(n) は g !! (n-1) のつもり.
- 偶数番目の 要素 g(2n) は g(n) + 1
偶数はそのまんま d2
- 奇数番目の 要素 g(2n+1) は g(6n+4) + 1
奇数は 6 つ先の要素に1を加えたものと等しい.偶数,奇数と交互に g を作成していくので,3つずつ飛ばしながら作っていく.
m3p1 の偶数番目の要素は fromMaybe によって選ばれないのでそれ以上は計算されないのかな.
idx | _ | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | ... |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
(_:_:m3p1) | g(1) | g(4) | g(7) | g(10) | g(13) | g(16) | g(19) | g(22) | g(25) | g(28) | g(31) | g(34) | g(37) | g(40) | g(43) | g(46) | g(49) | ... |
d2 | _ | _ | J g(1) | N | J g( 2) | N | J g( 3) | N | J g( 4) | N | J g( 5) | N | J g( 6) | N | J g( 7) | N | J g( 8) | ... |
g | _ | 1 | g(1)+1 | g(10)+1 | g( 2)+1 | g(16)+1 | g( 3)+1 | g(22)+1 | g( 4)+1 | g(28)+1 | g( 5)+1 | g(34)+1 | g( 6)+1 | g(40)+1 | g( 7)+1 | g(46)+1 | g( 8)+1 | ... |
_ | 2 | ... | ||||||||||||||||
_ | 3 | ... | ||||||||||||||||
_ | 4 | ... | ||||||||||||||||
_ | 5 | ... | ||||||||||||||||
_ | 6 | ... | ||||||||||||||||
_ | 7 | ... | ||||||||||||||||
_ | 8 | ... | ||||||||||||||||
_ | 9 | 10 | ... | |||||||||||||||
_ | g(22)待ち | g(28)待ち | g(34)待ち | g(40)待ち | g(7)待ち | g(46) | 待ち | ... |
g(3) が求まるには, g(10) が必要,g(10) には... とまさに今回の問題の回数がそのまま入る.
interleave
http://www.tom.sfc.keio.ac.jp/~sakai/d/?date=20060714#p01
酒井さんのコードだと g の求め方が interleave (/\/) つかってて 6個飛ばしの辺がわかりやすい.
/\/ の第2引数 の map ... は,g を 9 個捨てたの([g(10), g(11), ...])を初期値にして,
そこから6個とばしの無限リストの無限リストになって ([[g(10),...], [g(16),...], [g(22)...],...] ←イメージ),
map head する([g(10), g(16), g(22), ...].
idx | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | ... |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
g /\/ | - | g(1)+1 | g( 2)+1 | g( 3)+1 | g( 4)+1 | g( 5)+1 | g( 6)+1 | g( 7)+1 | g( 8)+1 | ... | |||||||
/\/ map ... | - | g(10)+1 | g(16)+1 | g(22)+1 | g(28)+1 | g(34)+1 | g(40)+1 | g(46)+1 | ... | ||||||||
g | 1 | g(1)+1 | g(10)+1 | g( 2)+1 | g(16)+1 | g( 3)+1 | g(22)+1 | g( 4)+1 | g(28)+1 | g( 5)+1 | g(34)+1 | g( 6)+1 | g(40)+1 | g( 7)+1 | g(46)+1 | g( 8)+1 | ... |
あとは同じ.
こんなん思いつかんがな….絵かいてやっとわかったがな….