到目前为止,我对n-1和n + 1的定义分别为suc和inc
add x y | y > 0 = add (inc x) (suc y)
add x y | y < 0 = add (suc x) (inc y)
add x 0 = x
add 0 y = y
如何在我的乘法函数中仅使用递归,if-then和no +, - 等来使用它
我知道x * y的结果等于将y加到(x-1)* y的结果
但我不知道如何将其放入代码中。感谢。
答案 0 :(得分:3)
如果我们将自然数定义为:
data Nat where
Zero :: Nat -- 0
Succ :: Nat -> Nat -- \n -> n + 1
然后,我们可以按如下方式定义add
:
add :: Nat -> Nat -> Nat
add n Zero = n -- n + 0 = n
add n (Succ m) = Succ (add n m) -- n + (m + 1) = (n + m) + 1
接下来,我们可以用mul
:
add
mul :: Nat -> Nat -> Nat
mul n Zero = Zero -- n * 0 = 0
mul n (Succ m) = add (mul n m) n -- n * (m + 1) = (n * m) + n
同样,我们可以根据exp
:
mul
exp :: Nat -> Nat -> Nat
exp n Zero = Succ Zero -- n ^ 0 = 1
exp n (Succ m) = mul (exp n m) n -- n ^ (m + 1) = (n ^ m) * n
注意这里的模式?这称为primitive recursion。
答案 1 :(得分:1)
基本实现是:
mul x 0 = 0
mul x y = add x (mul x (y - 1))
您需要将y - 1
替换为您的递减函数(奇怪地命名为suc
)。这也不适用于负乘数,但你可以使用它。