-5

一个迭代版本的奇数?对于非负整数参数,可以使用 and、or 和 not 编写。为此,您必须利用 and 和 or 是按从左到右的顺序评估其参数的特殊形式这一事实,一旦确定值就退出。编写 (boolean-odd? x) 时不使用 if 或 cond,而是使用 and, or, not (boolean)。您可以使用 + 和 -,但不要使用商、余数、/ 等。

4

2 回答 2

0

正奇数可以定义为 1 + 2n。因此奇数是:

  • 如果 x 为 1
  • 如果 x 大于 1 andx-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时,余数是否在某些特权余值集中来概括您的问题。由于这几乎可以肯定是家庭作业,因此我不想直接回答您的问题,但我会回答这个更通用的版本,而不会受到仅使用andand的限制or

(define (special-remainder? k n special-remainders)
  (if (< k n)
      (member k special-remainders)
      (special-remainder? (- k n) special-remainders)))

special-remainder?递归地除以kn直到找到小于的余数n。然后n测试它的特殊性。在您正在考虑的情况下,您将能够消除special-remainders,因为您不需要(member k special-remainders)。由于您只有一个特殊余数,因此您只需检查是否k 该特殊余数。

于 2013-10-09T20:35:34.177 回答