编程 * 仅使用 succ 和 pred
Programming * using only succ and pred
如何仅使用 succ
和 pred
制作乘法函数?
我已有的加法函数:
plus :: Integer -> Integer -> Integer
plus a b | a == 0 = b
| otherwise = succ (pred a ´plus´ b)
这个结构很难特别。您只需要了解什么是乘法的基本逻辑 x*y 就是将 x 与自身相加 y 次。
x乘以0等于0
x乘以1是x
x乘以N等于x加x乘以x乘以N-1。
假设性能在这里不是问题,因此没有理由使用尾递归,一个简单的定义是:
mul :: Integer -> Integer -> Integer
mul x 0 = 0
mul 0 y = 0
mul x 1 = x
mul x n = x + mul x (n - 1) -- use plus instead of + if you were asked to
这可以进一步压缩 - 我们 真的 不需要 1 的情况,或者双方的零情况,因为添加零只是零,乘以 1 是x + 乘以零。
mul x 0 = 0
mul x y = x + mul x (n-1)
plus :: Integer -> Integer -> Integer
plus a 0 = a
plus a b = plus (succ a) (pred b)
a 变为 a + b -> b 变为零
mult :: Integer -> Integer -> Integer
mult a 0 = 0
mult a b = plus a (mult a (pred b))
这样展开了b次。
如何仅使用 succ
和 pred
制作乘法函数?
我已有的加法函数:
plus :: Integer -> Integer -> Integer
plus a b | a == 0 = b
| otherwise = succ (pred a ´plus´ b)
这个结构很难特别。您只需要了解什么是乘法的基本逻辑 x*y 就是将 x 与自身相加 y 次。
x乘以0等于0
x乘以1是x
x乘以N等于x加x乘以x乘以N-1。
假设性能在这里不是问题,因此没有理由使用尾递归,一个简单的定义是:
mul :: Integer -> Integer -> Integer
mul x 0 = 0
mul 0 y = 0
mul x 1 = x
mul x n = x + mul x (n - 1) -- use plus instead of + if you were asked to
这可以进一步压缩 - 我们 真的 不需要 1 的情况,或者双方的零情况,因为添加零只是零,乘以 1 是x + 乘以零。
mul x 0 = 0
mul x y = x + mul x (n-1)
plus :: Integer -> Integer -> Integer
plus a 0 = a
plus a b = plus (succ a) (pred b)
a 变为 a + b -> b 变为零
mult :: Integer -> Integer -> Integer
mult a 0 = 0
mult a b = plus a (mult a (pred b))
这样展开了b次。