拡張しましょう。また、関数はpow
ではなくと呼ぶ必要がありますsqr
が、それはあまり重要ではありません。
sqr 10 2 = sqr (10 * 10) (2 - 1)
= sqr 100 1
= sqr (100 * 100) (1 - 1)
= sqr 10000 0
= 10000
これはその理由を示していsqr 10 2 = 10000
ます。
再帰するたびに、 の値が異なりますm
。したがって、何らかの方法でそれを考慮する必要があります。
m
毎回異なる値を持っていても機能するバージョンを作成するか、または
周りの元の値を維持する方法を見つけますm
。
m^n = m * m^(n-1)
最も簡単な方法は、 、、 という事実を利用していると言えm^0 = 1
ます。
あなたが賢いなら、はるかに高速な方法があります。これもm^2n = (m^n)^2
.
スポイラー
上で書いた数式のいくつかは、実際に有効な Haskell コードです。
import Prelude hiding ((^))
infixr 8 ^
(^) :: Int -> Int -> Int
-- Do these two lines look familiar?
m^0 = 1
m^n = m * m^(n-1)
これは関数の中置バージョンです。中置演算子を通常の関数に変更できます。
pow :: Int -> Int -> Int
pow m 0 = 1
pow m n = m * pow m (n - 1)
そしてより速いバージョン:
pow :: Int -> Int -> Int
pow m 0 = 1
pow m n
| even n = x * x where x = pow m (n `quot` 2)
| otherwise = m * pow m (n - 1)