Копирование элементов из списка на основе второго списка - PullRequest
0 голосов
/ 06 ноября 2019

Напишите функцию, которая реплицирует элементы в списке на основе второго списка, определяя, сколько раз элементы должны дублироваться.

Напишите функцию в Ocaml функциональным способом программирования с использованием списков.

Если функции библиотеки - могут использоваться только с O (1) вычислительной сложностью.


Например:

duplicate [5;6;7] [0;2;5;3];;

возвращает:

[6;6;7;7;7;7;7]

Код, который я изобрел до сих пор:

let duplicate (list1, list2)=
let rec read (list2, list1) = 
if List.hd list2 = 0 then read (List.tl list2, List.tl list1) else print (List.hd list2, List.hd list1)
let rec print (acc, num) =
num :: (print (acc-1, num));;

  • Прежде всего, он не компилируется, у меня "синтаксическая ошибка" ...
  • Я не уверен в этих "вложенных" функциях.
  • Я считаю, что сложность могла бы быть лучше.

1 Ответ

0 голосов
/ 06 ноября 2019

Когда вы обдумываете ответ на этот вопрос, вы должны рассмотреть самый простой случай ... т.е. Как я могу добавить элемент в список x раз. Пример:

let rec add_elem_num_times num times lst =
  match times with
  | 0 -> lst
  | _ -> add_elem_num_times num (times - 1) (num::lst)

let ans = add_elem_num_times 5 3 (add_elem_num_times 3 8 [])

let () = List.iter (fun x -> Printf.printf "%d\n" x) ans

Остальное просто заставляет его работать для многих элементов.

...