這是遞歸循環定義一個通用的誤解。你試圖檢查的是所謂的「基本條件」或「基本情況」。這是最容易處理的匹配:
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