问题描述
我对 SML 和函数式编程非常陌生。
我已经搜索了该网站,但无法找到我的问题的答案。
例如,range(2,12,3) 应该返回列表 [2,5,8,11]。
我没有收到任何错误,但是当我尝试运行 range(2,3);光标前进到下一行,什么也没发生,我什至无法在 smlnj 应用程序中输入任何内容。
这是我的代码:
fun range(start,stop,step) =
if start = stop then nil
else start::range(start+step,step);
输出:
val range = fn : int * int * int -> int list
我需要对代码进行哪些更改,以便在运行 range(2,3) 时得到 [2,11] ?
谢谢
解决方法
您中断递归的条件 (start = stop
) 是错误的。在您的示例中,您将使用 start=2
、start=5
、start=8
、start=11
、start=14
、...执行递归调用,从而导致无限循环。不是什么都没发生,只是smnlj一直在计算...
只要 stop - start
不是步长的倍数(或零),您就有无限递归。
查看 range(11,12,3)
,它应该会生成您的最后一个数字:
if 11 = 12 then nil
else 11::range(11+3,3)
这将计算range(14,3)
:
if 14 = 12 then nil
else 14::range(14+3,3)
然后是 range(17,3)
,以此类推,无止境。
您需要将 =
替换为 >
或 >=
,具体取决于是否应包含 stop
。