2013-05-26 15 views
13

Haskellのmy Fibobacciシーケンス実装の結果を、私が数値のoptputにいくつかの "奇妙な"形式を認識したのを見ていました。すべてのフィボナッチSeq。奇妙な出力形式(Haskell)

まず、これは私が作ってみたHaskellコードです:

fib :: Integer -> [Integer] 
fib 0 = [0] 
fib 1 = [0, 1] 
fib a = (fib' 0 1 [0,1] 1 a) 

fib' :: Integer -> Integer -> [Integer] -> Integer -> Integer -> [Integer] 
fib' n1 n2 l cont n 
     | cont == n = l 
     | otherwise = (fib' n2 n3 (l++[n3]) (cont+1) n) 
      where n3 = n2 + n1 

FIB 10のようなものの場合、出力は次のようになります。[0,1,1,2,3,5、 8,13,21,34,55] それから、フィックス1000のようなものを試したかったのですが、数値は非常に大きく、すべて...私が見たのは、 "、"によって形成された奇妙な楕円リストから、例えば各整数:だから私はしました

example1

この奇妙なパターンがまだ繰り返してしまうかどうかを確認するために、出力ウィンドウのサイズを限界に達し、そして答えはイエスです:

example2

そして、私の質問は次のとおりです。

」でこのパターンが現れる理由を誰もが知っています、 "リストの整数の間? それはもっと無作為でなくてはならないでしょうか?

+3

[this reddit post](http://www.reddit.com/r/haskell/comments/xwfbm/iterate_2_1/)も参照してください。 –

+1

これは[CodeGolf](http://codegolf.stackexchange.com/)ですばらしいことになります。 – crockeea

答えて

21

フィボナッチ数grow as an exponential functionn

小数点以下の数値の長さは、従って、実質的にその対数ベース10で対数及び指数が互いに打ち消し合うので、フィボナッチの長さは、Nの線形関数のように成長します。

したがって、列に印刷すると、直線が表示されます。しかし、それらを一つずつ印刷するので、ポジションが累積します。あなたが線形シーケンスの累積合計を取っているなら、二次シーケンスを得る。

ローカルでは、すべての行にほぼ同じ数のフィボナッチ数が含まれています。kとしましょう。これには2つのことを意味します

  1. 行番号がNに対して直線的に変化します。
  2. コンマの実際の位置(ウィンドウの左端を基準にして)を計算するには、累積 "絶対位置"の残りの部分を線の長さで乗算する必要があります。これは、(平均して)1/kを1増分ごとに引いたものと等価です(n)。この調整は線形であり、位置の二次的挙動は変化しない。

あなたが見ているのは放物線です - 二次関数のグラフです。

+0

感謝しています。 –

3

あなたはそれについて考えるときに奇妙なことはありません。隣接するフィボナッチ数は同様の長さを有し、その長さはシーケンスと共に増加している。 >安定した - - >右の動きあなたの左を与える

29, 29, 29, 30, 30, 30, 31, 31, 31 

:だからあなたは30文字の画面サイズを持って、そしてあなたの現在の​​29桁、その後、次のいくつかの数字のために、長さは可能性を持っていると仮定。