私は Haskell Prelude を読んでいて、それがかなり理解しやすいと思っていましたが、指数の定義に出くわしました:
(^) :: (Num a, Integral b) => a -> b -> a
x ^ 0 = 1
x ^ n | n > 0 = f x (n-1) x
where f _ 0 y = y
f x n y = g x n where
g x n | even n = g (x*x) (n `quot` 2)
| otherwise = f x (n-1) (x*y)
_ ^ _ = error "Prelude.^: negative exponent"
ネストされた 2 つの の必要性がわかりませんwhere
。
私がこれまでに理解したこと:
(^) :: (Num a, Integral b) => a -> b -> a
基数は数値で、指数は整数でなければなりません。
x ^ 0 = 1
ベースケース、簡単。
g x n | even n = g (x*x) (n `quot` 2)
| otherwise = f x (n-1) (x*y)
2 乗によるべき乗... 一種の ... なぜf
ヘルパーが必要なのですか? なぜf
とはg
一文字の名前が付けられているのですか? それは単なる最適化ですか、明らかな何かが欠けていますか?
_ ^ _ = error "Prelude.^: negative exponent"
N > 0 は以前にチェックされていましたが、ここにたどり着いた場合は N が負であるため、エラーです。
私の実装は、次のコードへの直接翻訳になります。
Function exp-by-squaring(x, n )
if n < 0 then return exp-by-squaring(1 / x, - n );
else if n = 0 then return 1; else if n = 1 then return x ;
else if n is even then return exp-by-squaring(x * x, n / 2);
else if n is odd then return x * exp-by-squaring(x * x, (n - 1) / 2).
ウィキペディアからの疑似コード。