我似乎无法找到这个看似简单的SML问题的简单答案。我有代码:
fun inde(x, y, L) = if null L then nil else
if x=hd(L) then y+1::inde(x,y+1,tl L) else
inde(x,y+1,tl L);
我希望y成为函数外的变量,所以它将是inde(x,L)但y仍然正常计数。当我在函数外部声明它(为0)时,当递归调用函数时,它会重置为0.
如果你要运行这个当前函数,它会产生一个列表,列出列表中的x(L)。 所以inde(1,0,[1,2,2,1,1])会产生[1,4,5]
答案 0 :(得分:1)
使用函数式编程风格时的惯用结构是定义一个内部函数,它接受程序员感兴趣的参数,但不是用户,然后从main函数调用内部函数:
fun inde(x : int, L) =
let
fun inner(list1, list2, y : int) =
if null list1
then List.rev list2
else
if x = hd list1
then
inner(tl list1, y::list2, y + 1)
else
inner(tl list1, list2, y +1)
in
inner(L,[],1)
end
在示例函数中:
inner
使用四个值:局部变量list1
,list2
和y
。它还使用封闭范围内的x
。
inner
构建(汇总)将使用list2
返回的列表。它通过调用SML Basis Library中的List.rev
来反转列表。这会将O(n)添加到执行时间。
let...in...end
构造的最后一部分:inner(L,[],1)
被称为"蹦床"因为代码一直到源文件的底部,然后退回它以开始执行。这是一种标准模式。
请注意,我开始使用等于1的y
进行迭代,而不是0.从0开始并未在原始文件中完成任何操作。