首页 > 解决方案 > 范围函数未通过所有测试

问题描述

我正在编写一个范围函数,它应该返回指定范围内的整数列表。

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 有关,但我不知道为什么。

需要更改哪些内容才能使函数返回两个测试的预期输出?

谢谢

标签: sml

解决方案


不要与 比较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 []

推荐阅读