Safe Haskell | None |
---|---|
Language | Haskell2010 |
第2章 練習問題 F
以下は x の n 乗を求める関数で,この関数では exp x n を求めるのに n-1 回の乗算が必要です.
exp :: Integer -> Integer -> Integer exp x n | n == 0 = 1 | n == 1 = x | otherwise = x * exp x (n - 1)
尻高君の方法は以下のとおりで,乗算は高々 2p 回です.
exp :: Integer -> Integer -> Integer exp x n | n == 0 = 1 | n == 1 = x | even n = exp (x * x) m | odd n = x * exp (x * x) m
- 関数呼び出しトレース
以下はオマケ(説明はありません).
- gexpG :: (Integer -> Integer -> Integer) -> Integer -> Integer -> Integer
- expG :: Integer -> Integer -> Integer
- expG' :: Integer -> Integer -> Integer
- gexpS :: (Integer -> Integer -> Integer) -> Integer -> Integer -> Integer
- expS :: Integer -> Integer -> Integer
- expS' :: Integer -> Integer -> Integer
- traceOfCall :: (Show a, Show b) => String -> (a -> b -> c) -> a -> b -> c
- tracing :: (Show a, Show b) => String -> ((a -> b -> c) -> a -> b -> c) -> a -> b -> c
- gfun :: ((a -> b) -> c -> d) -> ((c -> d) -> a -> b) -> c -> d
Documentation
gexpG :: (Integer -> Integer -> Integer) -> Integer -> Integer -> Integer Source #
O(n) 回の乗算を必要とする expG を生成する汎関数
expG' :: Integer -> Integer -> Integer Source #
O(n) 回の乗算を必要とする exp のトレース版
>>>
expG' 2 13
exp 2 13 exp 2 12 exp 2 11 exp 2 10 exp 2 9 exp 2 8 exp 2 7 exp 2 6 exp 2 5 exp 2 4 exp 2 3 exp 2 2 exp 2 1 8192
gexpS :: (Integer -> Integer -> Integer) -> Integer -> Integer -> Integer Source #
O(log n) 回の乗算を必要とする expS を生成する汎関数
expS' :: Integer -> Integer -> Integer Source #
O(log n) 回の乗算を必要とする exp のトレース版
>>>
expS' 2 13
exp 2 13 exp 4 6 exp 16 3 exp 256 1 8192