1

编写一个复制列表中每个元素的函数。例如:{Duplicate [1 2 3]} 返回列表 [1 1 2 2 3 3]。

我怎样才能在 OZ mozart 中制作它?我不知道 oz 的 sintaxis,在序言中会是这样的:

even(N) :- 
    N mod 2 =:= 0.    

doubleeven([],[]).

doubleeven([H|T], [H,H|Z]) :-
    even(H),
    !,
    doubleeven(T,Z).

doubleeven([H|T], [H|Z]) :-
    doubleeven(T,Z).
4

1 回答 1

0

这是一种基于模式识别的解决方案。你检查传入的数据是否是一个列表(即它有一个头部和一个尾部(H|T)),然后第一个元素绑定到变量标识符 H。这样你就可以通过添加两个来重复H 在你继续对列表的其余部分做同样的事情之前。如果 L 为 nil - 空列表,请记住返回 nil,以便您的最终答案也是一个列表。

declare
fun {Duplicate L}
   case L of H|T then
      H|H|{Duplicate T}
   else
      nil
   end
end

{Browse {Duplicate [1 2 3]}}
于 2015-02-25T00:02:08.277 回答