Ocaml: распечатка элементов в массиве int списков - PullRequest
3 голосов
/ 23 апреля 2011

У меня есть функция, которая создает состояние.Состояние определяется как:

type state = graph * bool array;;

Граф:

type graph = int list array;;

Граф - это массив, и в каждом индексе может быть список int, сохраненный в этом индексе.

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

Я определил функцию следующим образом:

let state_of_graph (s:state) (out:out_channel) : unit = 
     match s with
     (g, b)

Я в основном хочу пройтись по моему графику (g) и распечатать индекс, а также каждый элемент в списке int (если элементы существуют, в противном случае не распечатывать пустые элементы).

Я хочу напечататьих в порядке: (учитывая, что индекс 0 имеет 2 элемента в нем)

index0 -> element1 
index 0-> element2

1 -> 2 3

Само состояние является как графом, так и логическим массивом.Я запутался в том, что именно делать отсюда (реализация).Я знаю, что мне нужно сделать, это выполнить итерацию по моему графику и распечатать индекс, за которым следует стрелка, за которой следуют отдельные целые.

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

Ответы [ 2 ]

1 голос
/ 23 апреля 2011

Ваше описание ваших структур данных довольно плохое.Например, вы пишете: «График - это массив, и в каждом индексе может быть список int, сохраненный в этом индексе». Что ж, это почти то, что означает type graph = int list array (фактически, в каждом индексе всегда есть список int.), поэтому ваше английское предложение не содержит никакой дополнительной информации.Было бы более полезно объяснить, что представляет каждый элемент массива.Поскольку вы говорите о графике, я думаю, что это что-то вроде a.(i) содержит j означает, что есть грань от i до j?

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

Чтобы выполнить итерацию по массиву, у вас есть две основные возможности: написать цикл for или использовать одну из функцийArray.iter или Array.iteri.Эта задача, кажется, хорошо подходит для Array.iteri, поскольку вы просто просматриваете массив и вам нужно знать индекс.

let print_graph (g, a : state) (out : out_channel) : unit =
  Array.iteri (fun i l -> …) g;;

Хорошо, теперь нам нужно знать, что делать с каждым элементом массива.Каждый элемент представляет собой список целых чисел: l имеет тип int list.Из вашего примера вывода вы просто хотите вывести элементы списка по порядку с пробелом между ними.Чтобы перебирать элементы списка по порядку, стандартная библиотечная функция List.iter как раз подходит.

let print_node (l : int list) (out : out_channel) : unit =
  List.iter (fun j -> print_char ' '; print_int j) l;;

Теперь вы должны иметь возможность использовать print_node, чтобы завершить print_graph.Вам все равно придется печатать указатель и стрелку в начале каждой строки и печатать строку только при наличии индекса.

0 голосов
/ 23 апреля 2011

Я забыл большую часть моего ocaml, извините, что не пишу код: -)

Имеет ли массив и список map? если это так, сопоставьте массив и верните индекс + "->", и на этой карте также добавьте то, что вы получите, когда сопоставляете список, преобразуйте целые числа в строки и объедините их.

Это вообще помогло?

...