Необходимо написать функцию «blendList», без использования каких-либо встроенных функций, кроме ‘length’

#functional-programming #sml

#функциональное программирование #sml

Вопрос:

Я пытаюсь решить эту проблему:

Определите функцию

 blendList : 'a list * 'a list -> 'a list
  

это принимает два списка и возвращает один список, содержащий «смесь» двух списков со значениями, выбранными в строгом чередовании из двух списков. Не используйте никаких встроенных стандартных функций ML, кроме length .

Некоторые примеры:

 blendList([1,2], [100,200,300,400]) (* Returns [ 1 ,100,2 ,200,300,400] *)
blendList([200,100,300,900], [3,1]) (* Returns [ 200 ,3,100 ,1,300,900] *)
blendList([],[100,200]) (* Returns [100,200] *)
blendList([1,2],[]) (* Returns [1,2] *)
  

Как мне это сделать?

Комментарии:

1. Вам не нужно length , поэтому немного странно позволять вам ее использовать.

2. Пожалуйста, не создавайте больше работы для других, вандализируя ваши сообщения. Размещая в сети Stack Exchange (SE), вы предоставляете SE неотзывное право по лицензии CC BY-SA распространять контент (т. Е. Независимо от вашего будущего выбора). Согласно политике SE, распространяется версия, не подвергшаяся вандализму. Таким образом, любой вандализм будет отменен. Пожалуйста, смотрите: Как работает удаление? … . Если разрешено удалять, под сообщением слева есть кнопка «удалить», но это только в браузерах, а не в мобильном приложении.

Ответ №1:

Пожалуйста, рассмотрите следующий код:

 fun blendList ([], l) = l
  | blendList(l, []) = l
  | blendList(a :: restA, b :: restB) = a :: b :: blendList(restA, restB);
  
blendList([1,2], [100,200,300,400]); (* Returns [ 1 ,100,2 ,200,300,400] *)
blendList([200,100,300,900], [3,1]); (* Returns [ 200 ,3,100 ,1,300,900] *)
blendList([],[100,200]); (* Returns [100,200] *)
blendList([1,2],[]); (* Returns [1,2] *)
blendList([1,2],[1,2]); (* Returns [1,1,2,2] *)
  

Мы разделили blendList на 3 варианта:

  1. Первый список пуст.
  2. Второй список пуст.
  3. У обоих есть записи.

В первом варианте мы берем второй список. во втором варианте мы берем первый список. В последнем мы берем оба первых элемента и снова активируем тот же метод с тем, что осталось.

Обратите внимание, что если оба списка имеют одинаковый размер, он перейдет к последнему вызову blendList[[], []] , который попадет в первый случай, и вернется [] .