Дублируйте элементы списка OZ
Напишите функцию, которая дублирует каждый элемент в списке. Например: {Duplicate [1 2 3]} возвращает список [1 1 2 2 3 3].
Как я могу сделать это в OZ Mozart? Я не знаю синтаксиса унции, в прологе было бы что-то вроде:
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).
1 ответ
Решение
Это решение, основанное на распознавании образов. Вы проверяете, являются ли входящие данные списком (то есть имеют ли они заголовок и хвост (H|T)), а затем первый элемент привязывается к идентификатору переменной H. Таким образом, вы можете просто повторить, добавив два H, прежде чем вы продолжите делать то же самое с остальным списком. Не забудьте вернуть nil, если L - ноль - пустой список, так что ваш окончательный ответ также является списком.
declare
fun {Duplicate L}
case L of H|T then
H|H|{Duplicate T}
else
nil
end
end
{Browse {Duplicate [1 2 3]}}