scheme - 在方案(球拍)中编写一个函数以返回给定范围内的奇数列表
问题描述
这是我写的:
(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)
解决方案
使用适当的比较运算符
一般来说,为了比较方案中的元素,建议使用更“专业”的运算符。对于数字,要使用的相等运算符 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)
推荐阅读
- python - 让 PubNub 订阅者作为服务保持活跃(Python SDK)
- r - 具有多面手帕累托分布的模拟社区
- powershell - 替换 PowerShell 中的字符串:“-”
- android - 替换活动中的片段
- javascript - 窗口位置和innerHtml替换
- java - Jackson 将地图数组反序列化为带有 javax 约束验证的 TreeMap
- ruby-on-rails - .each 遍历空集合 - Ruby on Rails
- javascript - 尝试使用 Promises 和 .then() 从 Firebase 获取 Image-Url
- javascript - 使用 Rails 将插件添加到 Webpack
- node.js - socket.io 中的延迟发射回调