iT邦幫忙

DAY 8
3

蠻可愛的 Erlang 與 Elixir系列 第 8

是遞迴,我加了遞迴.

昨天最後介紹的用兩行就山寨了for,如此黯然;

for(Max, Max, F) -> [F(Max)];
for(I, Max, F) -> [F(I) | for(I+1, Max, F)].

是遞迴,我加了遞迴.

今天來探討遞迴之前,先來看一段影片.

Yes
或是
http://youtu.be/E_UldQXT9cs

麻友友的自我介紹詞都是一樣,但是麻友友逐漸長大了.
跟我們在遞迴操作是一樣的.
遞迴其實很自然,就是人類反覆做事的一種方式.

我們在erlang用了遞迴的方式對List進行操作,
在 [F(I) | for(I+1, Max, F)] 中, F(I) 增加到List前面,
後面遞增,直到I與Max兩值相等時,就只需計算F(Max)值然後逐步返回.

接著來看計算List長度的函數的範例.

-module(mylen).
-export([len/1]).

len([]) -> 0;
len([_|T]) -> 1 + len(T).

編譯及執行:
1> c("mylen").
{ok,mylen}
2> mylen:len([a,b,c]).
3

當List為空時,長度為0;從頭逐步取出,內容不在乎,遞增計數值,遞迴呼叫
計算尾巴.
操作的過程可以用以下的方式來表示:

len([a,b,c]) = len([a | [b,c])
=> 1 + len([b | [c]])
=> 1 + 1 + len([c])
=> 1 + 1 + 1 + len([])
=> 1 + 1 + 1 + 0
=> 1 + 2
=> 3

接著看一下將List中的數字加總的函數.

-module(mysum).
-export([sum/1]).

sum([H | T]) -> H + sum(T);
sum([]) -> 0.

編譯及執行:
3> c("mysum").
{ok,mysum}
4> mysum:sum([10,20,30]).
60

有沒有發覺,在erlang中,遞迴其實比起一般的程序性語言,
能夠更容易的表達.


上一篇
erlang 7 List操作
下一篇
List comprehension與守衛(Guard)
系列文
蠻可愛的 Erlang 與 Elixir30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言