summaryrefslogtreecommitdiffstats
path: root/AufgabeFFP1.hs
blob: 705dce1cd0c75cb3841399710f5122ba01294d8f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
module AufgabeFFP1
where

-- calculates 2^ with each element of the continuous list
pof2s :: [Integer]
pof2s = map (2^) [0,1..]

-- alternate:
-- pof2s :: [Integer]
-- pof2s = iterate (2*) 1

-------------------------------------------------------------------------------

-- iterate steps:
-- (1) [1]
-- (2) zipWith (+) ([0,1])     ([1,0])     = [1,1]
-- (3) zipWith (+) ([0,1,1])   ([1,1,0])   = [1,2,1]
-- (4) zipWith (+) ([0,1,2,1]) ([1,2,1,0]) = [1,3,3,1]
-- ...
pd :: [[Integer]]
pd = iterate (\row -> zipWith (+) ([0] ++ row) (row ++ [0])) [1]

-------------------------------------------------------------------------------

-- steps:
-- (1) [pd !! (1-1) !! 0]
-- (2) [pd !! (2-1) !! 0]
-- (3) [pd !! (3-1) !! 0] ++ [pd !! (3-2) !! 1]
-- (4) [pd !! (4-1) !! 0] ++ [pd !! (4-2) !! 1]
-- (5) [pd !! (5-1) !! 0] ++ [pd !! (5-2) !! 1] ++ [pd !! (5-3) !! 2]
-- (6) [pd !! (6-1) !! 0] ++ [pd !! (6-2) !! 1] ++ [pd !! (6-3) !! 2]
-- (7) [pd !! (7-1) !! 0] ++ [pd !! (7-2) !! 1] ++ [pd !! (7-3) !! 2] ++ [pd !! (7-4) !! 3]
-- ...
-- (n) [pd !! (n-1) !! 0] ++ [pd !! (n-2) !! 1] ++ [pd !! (n-3) !! 2] ++ ...
fibdiag :: Integer -> [Integer]
fibdiag (n)
  | n <= 0 = []
  | otherwise = map (\x -> pd !! (fromInteger n - x) !! (x - 1)) [1..count]
  where
    count = (fromInteger n + 1) `div` 2

-------------------------------------------------------------------------------

fibdiags :: [[Integer]]
fibdiags = map (fibdiag) [1,2..]

-------------------------------------------------------------------------------

fibspd :: [Integer]
fibspd = map (\x -> sum x) fibdiags