sml - 范围函数未通过所有测试
问题描述
我正在编写一个范围函数,它应该返回指定范围内的整数列表。
range(2,12,3) 应该返回列表 [2,5,8,11]
range(10,2,~1) 应该返回列表 [10,9,8,7,6,5,4,3]
对于 range(2,12,3) 这有效:
fun range(start, stop, step) =
if start > stop then nil
else start::range(start+step, stop, step);
对于 range(10,2,~1) 这有效:
fun range(start,stop,step) =
if start <= stop then nil
else start::range(start+step, stop, step);
但是,我需要一个函数来处理这两种情况。我尝试使用 orelse 和 else if 如下,但该函数返回一个空列表。
要不然:
fun range(start, stop, step) =
if start > stop orelse start <= stop then nil
else start::range(start+step, stop, step);
否则,如果:
fun range(start,stop,step) =
if start > stop then nil
else if start <= stop then nil
else start::range(start+step,stop,step);
两种方法都返回
val it = [] : int list
我认为这与在基本情况下使用 nil 有关,但我不知道为什么。
需要更改哪些内容才能使函数返回两个测试的预期输出?
谢谢
解决方案
不要与 比较stop
,而是start
考虑 的符号stop - start
和 的符号step
。
如果你想一想,你会发现只要你在范围内,这些迹象都是一样的。
fun sgn x = if x < 0
then ~1
else if x > 0
then 1
else 0;
fun range (start, stop, step) = if sgn(stop-start) = sgn(step)
then start :: range (start + step, stop, step)
else []
推荐阅读
- html - JQuery .nextAll(试图获取 DOM 中下一个输入的值)返回“未定义”
- javascript - react hooks中的set方法没有设置值
- javascript - 类型错误:“字段”参数无效。必须是 CustomQuery.Query.distinct 中的字符串或函数
- web-applications - 我需要哪些技术将指令从 Web 服务器发送到连接到 Internet 的 Raspberry PI
- ios - 使用自定义迁移删除 coredata 对象
- laravel - Laravel 社交名流 - Google 提供商
- google-maps - 谷歌地图,绘制带有多个标记的路线,隐藏除最后一个标记之外的标记
- python - Buildbot:工人空闲
- node.js - Mongodb $lookup 不返回值
- python - Python/Matplotlib 中是否有选项可以在图中设置标记线?(每周、每月、每年)