这是递归循环定义一个通用的误解。你试图检查的是所谓的“基本条件”或“基本情况”。这是最容易处理的匹配:
display(0, _) ->
ok;
display(In, Rooms) ->
Room = array:get(In, Rooms)
io:format("~w~n", [Room]),
display(In - 1, Rooms).
然而,这是相当单一的。而不是使用手工递归函数,像fold或map这样的东西更常见。
尽管如此,大多数人可能会选择将房间表示为一个集合或列表,并使用列表操作对其进行迭代。当手书的“基本情况”将是一个空列表,而不是0:
display([]) ->
ok;
display([Room | Rooms]) ->
io:format("~w~n", [Room]),
display(Rooms).
这将是可以避免的青睐,再次,列表操作像foreach:
display(Rooms) ->
lists:foreach(fun(Room) -> io:format("~w~n", [Room]) end, Rooms).
一些人真的不喜欢这样朗读朗达数据。 (在这种情况下,我觉得可读,but the larger they get the more likely the are to become genuinely distracting)完全相同的功能的另一种表示:
display(Rooms) ->
Display = fun(Room) -> io:format("~w~n", [Room]) end,
lists:foreach(Display, Rooms).
可能本身赞成使用列表理解为一个速记的向上传递迭代:
_ = [io:format("~w~n", [Room]) | Room <- Rooms].
当只有试图得到一个副作用,但是,我真的认为lists:foreach/2
是语义原因的最佳选择。
我认为你遇到的困难的一部分是,你选择使用一个相当不寻常的结构作为你的第一个Erlang程序的基础数据,它执行任何操作(数组不常用,而且不是非常习惯于功能语言)。尝试使用列表首先 - 不吓人 - 一些成语和其他代码示例以及关于列表处理和函数式编程的一般讨论将更有意义。
等等!还有更多...
我没有处理的情况下,你有一个不规则的房间布局。假设一直是所有东西都放在一个很好的偶数网格中 - 当你进入真正有趣的东西(或者因为地图不规则或者因为拓扑很有趣)从来就不是这种情况。这里
的主要区别是,而不是简单地携带[Room]
一个列表,其中每个Room
值是表示室的状态的单个值,你就换了房间元组也包含一些额外的数据的状态值例如它的位置或坐标,名称等(您知道,“元数据” - 这是一个如此过载,充满喧嚣的术语,今天我讨厌这样说)。
假设我们需要维护坐标在房间所在的三维空间中,并且每个房间都有一个居住者列表。在数组的情况下,我们可以将数组除以布局的维数。 10 * 10 * 10空间将具有数组索引从0到999,并且每个位置将通过类似于
locate({X, Y, Z}) -> (1 * X) + (10 * Y) + (100 * Z).
的操作和各Room
的值来找到将[Occupant1, occupant2, ...]
。
定义这样一个数组然后将其任意大的区域标记为“不可用”以给出不规则布局的印象,然后解决尝试模拟3D宇宙的问题将是一个真正的烦恼。
相反,我们可以使用列表(或类似列表的东西)来表示一组房间,但Room
值现在将是一个元组:Room = {{X, Y, Z}, [Occupants]}
。你可能有一个额外的元素(或十个!),如房间的“名称”或其他状态信息或其他,但坐标是你可能获得的最确定的真实身份。拿到房状态,你会做和以前一样,但标志着你在看什么元素:
display(Rooms) ->
Display =
fun({ID, Occupants}) ->
io:format("ID ~p: Occupants ~p~n", [ID, Occupants])
end,
lists:foreach(Display, Rooms).
做任何事情比打印顺序更有趣,你可以与使用功能替换Display
的内部在图表上绘制房间的坐标,检查Occupants
的空白列表或完整列表(使用模式匹配,不要在程序上进行!)或其他您可能想到的任何事情。
你如何称呼'陈列'?你怎么定义'房间'阵列? – raina77ow 2014-12-01 18:43:23
喜欢这个:'Rooms = array:new([{default,false},{size,?SIZE}])'然后'display(Rooms,0)' – 2014-12-01 18:47:24
在我看来你的代码和它应该一样,不明白你想达到什么。你可以使用[array:foldl/3](http://www.erlang.org/doc/man/array.html#foldl-3)迭代一个数组。 – 2014-12-01 19:08:13