惡狼傳說 Erlang的有趣旅程

2022-01-12 06:15:18 字數 1293 閱讀 2430

鬱悶,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).