首页 > 解决方案 > 在方案(球拍)中编写一个函数以返回给定范围内的奇数列表

问题描述

这是我写的:

(define (odd-interval low high)
  (cond
    ((and (eqv? low high) (not(eqv?(modulo high 2) 0))) high)
    ((eqv? low high) '())
    ((not(eqv? (modulo low 2) 0)) (cons low (odd-interval (+ low 1) high)))
    (else (odd-interval(+ low 1) high))
    )
  )

这就是我所说的奇数间隔:

(odd-interval '1 '9 )

但这是输出:

(1 3 5 7 . 9)

有人可以帮我弄清楚输出中的时间段来自哪里吗?如果我有一个偶数表示高,它就不存在了。

例如,以下对奇数间隔的调用:

(odd-interval '1 '8 )

将返回:

(1 3 5 7)

标签: schemeracket

解决方案


使用适当的比较运算符

一般来说,为了比较方案中的元素,建议使用更“专业”的运算符。对于数字,要使用的相等运算符 is =, not eqv?

检查您的输入参数

如果函数被调用,(odd-interval 3 2)函数将永远循环。所以终止测试应该是(> low high)or (>= low high),而不是(= low high)or (eqv? low high)

可用时使用原始函数

odd?已经可以用来测试一个数字是否是奇数。

所以函数可以重写为:

(define (odd-interval low high)
  (cond ((> low high) '())
        ((odd? low) (cons low (odd-interval (+ low 1) high)))
        (else (odd-interval (+ low 1) high))))

注意:如果范围不包括最后一个元素,您可以使用>=而不是>,这是非常频繁地请求的。

最后,请注意,数字是对自己的评估,不需要引用它们,所以而不是:

(odd-interval '1 '9)

通常的方法是写:

(odd-interval 1 9)

推荐阅读