一个迭代版本的奇数?对于非负整数参数,可以使用 and、or 和 not 编写。为此,您必须利用 and 和 or 是按从左到右的顺序评估其参数的特殊形式这一事实,一旦确定值就退出。编写 (boolean-odd? x) 时不使用 if 或 cond,而是使用 and, or, not (boolean)。您可以使用 + 和 -,但不要使用商、余数、/ 等。
问问题
375 次
2 回答
0
正奇数可以定义为 1 + 2n。因此奇数是:
- 如果 x 为 1
- 如果 x 大于 1
and
x-2 是奇数。
因此,尾递归/迭代的一个*解决方案如下所示:
(define (odd? x)
(or (= ...) ; #t if 1
(and ... ; #f if less than 1
(odd? ...))); recurse with 2 less
*玩过它有很多方法可以做到这一点,并且仍然可以迭代并且没有 if/cond。
于 2013-10-09T21:34:08.713 回答
0
一个数是偶数,如果二等分它,如果有余数,则为奇数。通常,当您将数字k除以数字n时,余数是集合 {0,1,…n-1} 的一个元素。您可以通过询问当k除以n时,余数是否在某些特权余值集中来概括您的问题。由于这几乎可以肯定是家庭作业,因此我不想直接回答您的问题,但我会回答这个更通用的版本,而不会受到仅使用and
and的限制or
。
(define (special-remainder? k n special-remainders)
(if (< k n)
(member k special-remainders)
(special-remainder? (- k n) special-remainders)))
这special-remainder?
递归地除以k
,n
直到找到小于的余数n
。然后n
测试它的特殊性。在您正在考虑的情况下,您将能够消除special-remainders
,因为您不需要(member k special-remainders)
。由于您只有一个特殊余数,因此您只需检查是否k
是该特殊余数。
于 2013-10-09T20:35:34.177 回答