2011-10-27 114 views
4

我想學習如何用函數式編程思考,爲此,我試圖學習Erlang並從編碼中解決簡單的問題。我遇到了比較列表中元素的常見問題。例如,比較第i個位置元素的值與列表的第i + 1個位置的值。所以,我一直在思考和探索如何在Erlang(或任何函數式語言)中以功能的方式進行此操作。在Erlang中比較數組元素

請,溫柔和我在一起,我在這個世界上功能非常福利局,但我想學

在此先感謝

回答

4

定義列表:

L = [1,2,3,4,4,5,6] 

定義函數f,需要一個列表

  • 如果它匹配一個元素或一個空列表的列表,則返回空lis t
  • 如果它匹配第一個元素和第二個元素,則取第一個元素並通過調用剩餘列表遞歸構造一個新列表
  • 否則跳過列表的第一個元素。

在二郎山代碼

f ([]) -> []; 
f ([_]) -> []; 
f ([X, X|Rest]) -> [X | f(Rest)]; 
f ([_|Rest]) -> f(Rest). 

應用功能

f(L) 

這應該工作......沒有編譯和運行它,但它應該讓你開始。此外,如果您需要對其進行修改以改變其行爲方式。

歡迎來到二郎山;)

+0

非常感謝你 – Cheluis

1

我儘量溫柔;-)功能性的方法,使主要的是想在術語:輸入是什麼?應該輸出什麼?沒有什麼比較單獨的第i個元素與第i + 1個元素。必須始終具有導致數據轉換的目的。即使是Mazen Harake也是這樣做的。在這個例子中有一個函數,它只返回後面跟着相同值的元素,即過濾器給定列表。通常有非常不同的方式如何做類似的事情,這取決於它的目的。 List是基本的功能結構,你可以用Lisp給我們做很棒的事情,但是你必須記住它不是數組。

每次您需要訪問第i個元素可重複時,它表示您使用錯誤的數據結構。您可以在Erlang中構建不同的數據結構形式列表和元組,這可以更好地滿足您的需求。所以當你面對問題來比較第i個元素和第i + 1個元素時,你應該停下來思考。它的目的是什麼?你需要執行一些數據轉換爲Mazen Harake嗎?或者你需要隨機訪問?如果其次你應該使用不同的數據結構(例如array)。即使那樣你也應該考慮你的任務特徵。如果您將大部分閱讀並且幾乎從不寫,那麼您可以使用list_to_tuple(L),然後使用element/2進行閱讀。當你偶爾需要編寫代碼時,你會開始考慮將它分割成幾個元組,並且隨着寫入比率的增加,你將最終實現array

所以,你可以使用lists:nth/2如果你會做或幾次,但名單上只有一次,你是不是反常表現作爲我。您可以使用[X1,X2|_] = lists:nthtail(I-1, L)L = lists:nthtail(0,L)按預期工作)對其進行改進。如果你面對更大的名單,並且你想多次打電話,你必須重新考慮你的方法。

P.S:有,除了列表和樹上有很多其他有趣的數據結構。例如拉鍊。