检查n个数字是否都是奇数或甚至仅使用 - + *操作

时间:2018-05-18 21:16:01

标签: math sum operations

有没有办法检查N个数字,如果它们都是奇数或甚至而不使用mod函数%??? ,我只能使用 - + *函数。

1 个答案:

答案 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))