恶狼传说[Erlang的有趣旅程]

郁闷,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).
posted @ 2011-09-14 21:11  一缕青烟  阅读(345)  评论(0编辑  收藏  举报