有没有办法检查N个数字,如果它们都是奇数或甚至而不使用mod函数%??? ,我只能使用 - + *函数。
答案 0 :(得分:1)
因此,您可以使用加法,减法,乘法和比较。我还假设你可以定义函数,你的目标是定义两个函数:
evenList
函数获取一个数字列表并返回true iff(if-and-only-if)列表仅包含偶数。oddList
函数接受一个数字列表,如果列表只包含奇数,则返回true。首先让我们定义一个even
函数,它接受一个数字,如果输入是偶数则返回true:
even(i) = if (i == 0) true
else if (i == 1) false
else if (i > 1) even(i - 2)
else /* i < 0 */ even(i + 2)
我们可以根据odd
:
even
函数
odd(i) = even(i+1)
我们也可以递归地定义evenList
:
evenList(nil) = true
eventList(x : xs) = even(x) & evenList(xs)
(我使用x : xs
表示第一个元素为x
且余数为xs
的列表。我使用nil
表示空列表。)
但也许你不允许使用布尔&
运算符。我们可以做些什么呢?
考虑乘以两个数字i和j。根据i和j的奇偶校验,结果是什么? (奇偶性意味着奇怪或均匀。)
even(i) & even(j) -> even(i*j)
even(i) & odd(j) -> even(i*j)
odd(i) & even(j) -> even(i*j)
odd(i) & odd(j) -> odd(i*j)
(我使用->
表示“暗示”。)换句话说,如果i是奇数而j是奇数,则i * j为奇数。
因此,如果将所有输入数相乘并且乘积为奇数,则所有输入都是奇数。所以我们将定义一个product
函数:
product(nil) = 1
product(x : xs) = x * product(xs)
然后我们可以像这样定义oddList
:
oddList(xs) = odd(product(xs))
但是如何知道所有输入是否均匀?即使是单一的均匀输入也能使产品更加均匀。
诀窍是反转所有输入的奇偶校验,然后反转结果的奇偶校验。您可以通过添加或减去一个来反转奇偶校验。设i1 = i + 1,j1 = j + 1.然后:
even(i) & even(j) -> odd(i1) & odd(j1) -> odd(i1 * j1) -> even(i1 * j1 + 1)
even(i) & odd(j) -> odd(i1) & even(j1) -> even(i1 * j1) -> odd(i1 * j1 + 1)
odd(i) & even(j) -> even(i1) & odd(j1) -> even(i1 * j1) -> odd(i1 * j1 + 1)
odd(i) & odd(j) -> even(i1) & even(j1) -> even(i1 * j1) -> odd(i1 * j1 + 1)
换句话说,当(仅当 i为偶数且j为偶数时,(i + 1)*(j + 1)+ 1为偶数。
所以,让我们定义一个product1
函数,它返回所有输入的乘积,每个输入首先递增1:
product1(nil) = 1
product1(x : xs) = (x + 1) * product1(xs)
然后我们可以像这样定义evenList
:
evenList(xs) = even(1 + product1(xs))