因此,您可以使用加法,减法,乘法和比较。我还假设你可以定义函数,你的目标是定义两个函数:
evenList
oddList
首先让我们定义一个 even 取一个数字的函数,如果输入是偶数则返回true:
even
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
odd(i) = even(i+1)
然后我们可以定义 evenList 递归地:
evenList(nil) = true eventList(x : xs) = even(x) & evenList(xs)
(我正在使用 x : xs ?表示第一个元素的列表 x 其余部分是 xs 。我正在使用 nil 表示空列表。)
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)
(我正在使用 -> 意味着 implies 。)换句话说,如果i是奇数而j是奇数,则i * j是奇数。
->
因此,如果将所有输入数相乘并且乘积为奇数,则所有输入都是奇数。所以我们定义一个 product 功能:
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 + 1)*(j + 1)+ 1是偶数 的 当且仅当 强> 我是偶数,j是偶数。
那么,让我们来定义一个 product1 返回所有输入的乘积的函数,每个输入首先递增1:
product1
product1(nil) = 1 product1(x : xs) = (x + 1) * product1(xs)
然后我们可以定义 evenList 像这样:
evenList(xs) = even(1 + product1(xs))