昨天最後介紹的用兩行就山寨了for,如此黯然;
for(Max, Max, F) -> [F(Max)];
for(I, Max, F) -> [F(I) | for(I+1, Max, F)].
是遞迴,我加了遞迴.
今天來探討遞迴之前,先來看一段影片.
或是
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中,遞迴其實比起一般的程序性語言,
能夠更容易的表達.