郁闷,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{N > 2})时 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). {ok,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).