鬱悶,cnblogs編輯器還沒有erlang高亮.
開始,erlang的fibonacci
新建乙個erltest.erl,內有
-module(erltest
). %需和檔名同名
-export([
fib/1]
). %外部可呼叫的函式,所以編譯後外部可erltest:fib這麼呼叫,fib/1的 /1 表示函式有1個引數,同名不同參erlang是允許的fb(
1)->[1
,0]; %當碰到fb(1)模式時,直接返回[1,0]fb(
2)->[1
,1,0
]; %同上fb(
n)when
n >2-
> %當呼叫fb(n)時z =
fb(n-1
), %把前個結果賦給z,比如如果是fb(3),那麼將展開變成z = fb(2)-> z = [1,1,0]
[x,y|_] =z
, %模式匹配list的前兩個值,忽略tail值,_表示ignore.如果當前是fb(3),那麼x -> 1,y ->1
[x+y|z]
. %前兩個值相加,推入作為list的head,如果當前是fb(3),那麼[x+y|z] -> [2,1,1,0],因為z是[1,1,0]
fib(n)
->
lists
:reverse(fb
(n)).%反轉,暴露fib作為模組的呼叫函式
初探erlang函式式程式設計,**量不見得少,但是程式設計思維卻和順序式程式設計有天壤之別,變數非'變'量,**解析核心是模式匹配...很有意思。
趕緊編譯執行,erl進入erl shell.可cd('路徑')轉至erltest.erl所在目錄。
1>
c(erltest).
2>
erltest:fib(
10).[0
,1,1
,2,3
,5,8
,13,21
,34,55
]
bingo!
改進版/2012.03.12
fib(n) -> fib(n,[1,1]).fib(n,l) when n > 2 -> [x,y|_] = l ,fib(n-1,[x+y|l]);
fib(_,l) -> lists:reverse(l).