#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 варианта:
- Первый список пуст.
- Второй список пуст.
- У обоих есть записи.
В первом варианте мы берем второй список. во втором варианте мы берем первый список. В последнем мы берем оба первых элемента и снова активируем тот же метод с тем, что осталось.
Обратите внимание, что если оба списка имеют одинаковый размер, он перейдет к последнему вызову blendList[[], []]
, который попадет в первый случай, и вернется []
.