2013-09-16 6 views
0

Я застрял на этом в течение нескольких часов - подумал, может ли кто-нибудь помочь мне.OCaml: Список пэдов с нулями с использованием фальцовки

У меня есть два списка разной длины, и я хочу наложить более короткий список на 0, чтобы два списка имели одинаковую длину.

Я хочу сделать это, используя функции Folding, и НЕ используя рекурсию.

Любые советы очень ценятся!

+1

fold is recursion. почему вы не можете использовать рекурсию? – nlucaroni

+0

«НЕ использование рекурсии» запутан. Exersize должно быть указано как «вы не должны сами писать рекурсивную функцию, но используйте одну из функций списка сверток, уже доступных в стандартной библиотеке». – camlspotter

ответ

4

Это звучит как проблема домашней работы (частично из-за некоторого произвольного ограничения разрешенных решений). Таким образом, на самом деле это не помогает просто написать код для вас - это устраняет весь смысл выполнения домашних заданий. Однако вы не даете достаточно информации, чтобы помочь другим способом. Было бы намного легче помочь, если бы вы показали лучший код, который вы написали в течение часов, потраченных на проблему, и объяснили, почему вы считаете, что это не работает. Тогда люди могут рассказать вам, что может быть неправильно с кодом, и дать конкретные подсказки.

Не совсем понятно, что вы подразумеваете под «функциями сгибания». Вы не можете использовать List.fold_left2 или List.fold_right2, чтобы складывать оба списка одновременно, так как они предполагают, что входные списки имеют одинаковую длину. Это оставляет List.fold_left и List.fold_right (мне кажется).

Если вам разрешено сделать начальный проход, чтобы получить длину двух списков, вы можете сбросить более короткий список, чтобы сделать копию с дополнением, добавленным в конце. (Правая сглаживание проще всего, хотя она очень не работает для очень длинных списков.)

Одна из проблем с этим подходом заключается в том, что вам нужно будет делать дополнение отдельно, и для этого может потребоваться рекурсия (в основном из-за лимиты OCaml библиотеки IMHO). Другим подходом было бы сгибать более длинный список при перемещении и копировании более короткого. Более длинный список будет функционировать как мера, сообщающая вам, сколько дополнений добавить после того, как более короткий список будет исчерпан. Это было бы немного сложнее.

Если какой-либо подход кажется заслуживающим внимания, вы можете начать с написания функции, которая использует List.fold_right, чтобы скопировать список. Это довольно близко к тому, что вы хотите сделать (мне кажется).

-2

Поиск самой длины списка является рекурсивным. В любом случае, вот моя проблема в этой проблеме. Я использовал функцию табуляции из структуры списка SML. Кроме того, я предполагаю, что вы знакомы с анонимными функциями.

fun put_zeroes lst1 lst2 = 
    let 
     val zero_nums = List.length(lst2)-List.length(lst1) 
     val pad_zeroes = List.tabulate(zero_nums,fn x => 0) 
     val new_lst1 = [email protected]_zeroes     
    in 
     new_lst1 
    end