Skip to content
This repository was archived by the owner on May 22, 2026. It is now read-only.

Commit 24b657b

Browse files
feat: add fibonacci stream pattern
1 parent b83e87f commit 24b657b

6 files changed

Lines changed: 43 additions & 16 deletions

File tree

math/fibonacci/README.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
# フィボナッチ数列まとめ
2+
3+
## INDEX
4+
5+
- [再帰](./fibonacciRecursive.hs)
6+
- [一度計算した値を保存する](./fibonacciCache.hs)
7+
- [遅延評価を使った実装](./fibonacciLazy.hs): Haskellの遅延評価を利用して無限リストが定義できている。また、Haskellの遅延評価はcall-by-needなので、同じ式が複数回評価されず、メモ化と同様の効果が得られている。
8+
- [ストリームを使うバージョン](./fibonacciStream.hs)

math/fibonacci/fibonacciCache.hs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
-- 一度求めたフィボナッチ数列をキャッシュする
2+
-- NOTE: O(1)で要素にアクセスするためにVectorで実装した
3+
import Data.Vector (Vector, fromList, (!))
4+
5+
fibonacciVector :: Int -> Vector Int
6+
fibonacciVector n = vec
7+
where
8+
vec = fromList [fib i | i <- [0 .. n]] -- 一度計算したものはキャッシュされる
9+
fib 0 = 0
10+
fib 1 = 1
11+
fib i = vec ! (i - 1) + vec ! (i - 2) -- 計算済みを参照
12+
13+
main :: IO ()
14+
main = do
15+
let n = 35
16+
let fibs = fibonacciVector n
17+
print [fibs ! i | i <- [0 .. n]]
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
-- フィボナッチ数列の計算(再帰定義)
2+
fibonacciNumber :: Int -> Int
3+
fibonacciNumber n
4+
| n == 0 = 0
5+
| n == 1 = 1
6+
| otherwise = fibonacciNumber (n - 1) + fibonacciNumber (n - 2)
7+
8+
main :: IO ()
9+
main = do
10+
let range = [0 .. 35]
11+
let fibonacciNumberList = map fibonacciNumber range
12+
print fibonacciNumberList

math/fibonacci/fibonacci_old.hs

Lines changed: 0 additions & 16 deletions
This file was deleted.

math/fibonacci/fibonacciiStream.hs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
fibSeq :: Int -> [Int]
2+
fibSeq n = map fst $ take n $ iterate (\(a, b) -> (b, a + b)) (0, 1)
3+
4+
main :: IO ()
5+
main = do
6+
print $ fibSeq 36

0 commit comments

Comments
 (0)