我有一个创建状态的函数。状态定义为:
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
状态本身既是图形又是布尔数组。我很困惑从这里做什么(实现)。我知道我必须做什么,这是通过我的图表迭代,并打印索引后跟一个箭头,然后是单独的整数。
但我究竟该怎么做?
答案 0 :(得分:1)
您对数据结构的描述相当差。例如,您编写“图形是一个数组,并且在每个索引处可能存在一个存储在该索引处的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
。您仍然需要在每行的开头打印索引和箭头,并且只有在有索引时才打印一行。
答案 1 :(得分:0)
我忘记了大部分的ocaml,很抱歉我不写代码: - )
数组和列表都有map
吗?如果是这样,映射数组并返回索引+“ - >”,并在该映射中还附加在映射列表时获得的内容,将整数转换为字符串并连接它们。
这有用吗?