Это звучит как проблема домашней работы (частично из-за некоторого произвольного ограничения разрешенных решений). Таким образом, на самом деле это не помогает просто написать код для вас - это устраняет весь смысл выполнения домашних заданий. Однако вы не даете достаточно информации, чтобы помочь другим способом. Было бы намного легче помочь, если бы вы показали лучший код, который вы написали в течение часов, потраченных на проблему, и объяснили, почему вы считаете, что это не работает. Тогда люди могут рассказать вам, что может быть неправильно с кодом, и дать конкретные подсказки.
Не совсем понятно, что вы подразумеваете под «функциями сгибания». Вы не можете использовать List.fold_left2
или List.fold_right2
, чтобы складывать оба списка одновременно, так как они предполагают, что входные списки имеют одинаковую длину. Это оставляет List.fold_left
и List.fold_right
(мне кажется).
Если вам разрешено сделать начальный проход, чтобы получить длину двух списков, вы можете сбросить более короткий список, чтобы сделать копию с дополнением, добавленным в конце. (Правая сглаживание проще всего, хотя она очень не работает для очень длинных списков.)
Одна из проблем с этим подходом заключается в том, что вам нужно будет делать дополнение отдельно, и для этого может потребоваться рекурсия (в основном из-за лимиты OCaml библиотеки IMHO). Другим подходом было бы сгибать более длинный список при перемещении и копировании более короткого. Более длинный список будет функционировать как мера, сообщающая вам, сколько дополнений добавить после того, как более короткий список будет исчерпан. Это было бы немного сложнее.
Если какой-либо подход кажется заслуживающим внимания, вы можете начать с написания функции, которая использует List.fold_right
, чтобы скопировать список. Это довольно близко к тому, что вы хотите сделать (мне кажется).
fold is recursion. почему вы не можете использовать рекурсию? – nlucaroni
«НЕ использование рекурсии» запутан. Exersize должно быть указано как «вы не должны сами писать рекурсивную функцию, но используйте одну из функций списка сверток, уже доступных в стандартной библиотеке». – camlspotter