Дублируйте элементы списка 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]}}
Другие вопросы по тегам