奇数的迭代版本?对于非负整数参数,可以使用和,或,而不是。为此,您必须利用以下事实:和/或是从左到右按顺序评估其参数的特殊形式,一旦确定值就退出。写(boolean-odd?x)而不使用if或cond,而是使用and,or,而不是(boolean)。您可以使用+和 - ,但不要使用商,余数,/等。
答案 0 :(得分:0)
一个数字即使两个均分,也就是奇数,如果有一个余数则为奇数。通常,当您将数字 k 除以数字 n 时,余数是集合{0,1,... n-1}的一个元素。您可以通过询问当 k 除以 n 时,余数是否在某些特权的余数值集中来概括您的问题。由于这几乎肯定是家庭作业,我不想直接回答你的问题,但我会回答这个更通用的版本,而不是仅仅使用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
是否该特殊余数。
答案 1 :(得分:0)
正奇数可以定义为1 + 2n。因此奇数是:
and
,则x-2为奇数。因此,尾递归/迭代的一个*解决方案如下所示:
(define (odd? x)
(or (= ...) ; #t if 1
(and ... ; #f if less than 1
(odd? ...))); recurse with 2 less
*玩过它有很多方法可以做到这一点并且仍然可以迭代而不用if / cond。