Section 1.2

1.9 略

1.10 略

1.11

{- recursive style
f3' n 
    | n<3 = n
    | otherwise = f3(n-1) + 2*f3(n-2) + 3*f3(n-3)
-}    

getBegin n = n-(fromIntegral t)-1
    where t = floor (n-3) ::Integer

f3 n
    | n<3 = n
    | otherwise = f3_iter b (b-1) (b-2) (n-2)
                    where b = getBegin n
                          f3_iter a _ _ 0 = a
                          f3_iter a b c k = f3_iter (a+2*b+3*c) a b (k-1)

 1.12

pascal :: Integer -> Integer -> Integer
pascal n k
    | k==1 = 1
    | n==k = 1
    | k<n  = pascal (n-1) k + (pascal (n-1) (k-1))
    | otherwise = error "Invalid!"

 1.13 略

 1.14 略

 1.15 略

 1.16

-- Iterative version of fast-exp
fast_exp :: (Num a)=> a -> Integer -> a
fast_exp b n = exp_iter b n 1
    where exp_iter _ 0 a = a
          exp_iter b n a = if (even n ) then exp_iter (b*b) (n `div` 2) a
                           else exp_iter b (n-1) (a*b)

 1.17 略

 1.18

fast_mult :: Integer -> Integer -> Integer
fast_mult a b = fast_iter a b 0
    where fast_iter _ 0 s = s
          fast_iter a b s = if (even b) then fast_iter (a*2) (b `div` 2) s
                            else fast_iter a (b-1) (s+a)

 1.19

fast_fib :: Integer -> Integer
fast_fib n = fast_iter 1 0 0 1 n
    where fast_iter _ b _ _ 0 = b
          fast_iter a b p q count = 
            if (even count) then
                fast_iter a b (p*p+q*q) (p*q+q*p+q*q) (count `div` 2)
            else
                fast_iter (b*q+a*q+a*p) (b*p+a*q) p q (count-1)
                
fib :: Integer -> Integer
fib 0 =1
fib 1 =1
fib n = fib (n-1) + fib (n-2)          

  1.20 略

  1.21

smallestDivesor :: Integer -> Integer
smallestDivesor n = divTry 2 n
    where divTry a n
            | a*a > n  = n
            | n `mod` a ==0 = a
            | otherwise = divTry (a+1) n
            
main :: IO ()
main = do mapM_ (putStrLn.show.smallestDivesor) [199,1999,19999]       

 1.22 略

 1.23

smallestDivesor' :: Integer -> Integer
smallestDivesor' n = divTry 2 n
    where divTry a n
            | a*a > n  = n
            | n `mod` a ==0 = a
            | otherwise = divTry (next a) n
          next a = if a==2 then 3 else (a+2)

 1.24~1.28 略 質數問題,以後總結

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章