Erlang實(shí)戰(zhàn):楊輝三角、選擇排序、集合交與_第1頁(yè)
Erlang實(shí)戰(zhàn):楊輝三角、選擇排序、集合交與_第2頁(yè)
Erlang實(shí)戰(zhàn):楊輝三角、選擇排序、集合交與_第3頁(yè)
Erlang實(shí)戰(zhàn):楊輝三角、選擇排序、集合交與_第4頁(yè)
Erlang實(shí)戰(zhàn):楊輝三角、選擇排序、集合交與_第5頁(yè)
已閱讀5頁(yè),還剩6頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、Erlang實(shí)戰(zhàn):楊輝三角、選擇排序、集合交與并 九 相信大家都聽說過楊輝三角、選擇排序、集合交與并操作,本文就是用Erlang語(yǔ)言實(shí)現(xiàn)這三個(gè)有趣的程序,相信大家都知道這三個(gè)概念,那么正式我們的erlang實(shí)戰(zhàn)之旅吧!實(shí)戰(zhàn)1:輸出楊輝三角:接口為start(N),N為行數(shù)。-module(triangle).-export(start/1).start(N) -> L=getN(N), % 獲取第楊輝三角第N行元素列表ifN =:= 1 -> % N=1,直接輸出第一行,遞歸調(diào)用結(jié)束output(L);N =/= 1 -> % N>1,遞

2、歸調(diào)用start,先輸出第N-1行start(N-1),output(L)end.% 控制輸出第N行,列表L保存第N行元素,楊輝三角第N行有N個(gè)元素output(L) -> output(L,1).output(L,No) ->if length(L) =:= No -> io:format("pn",lists:nth(length(L), L);length(L) =/= No ->io:format("p,",lists:nth(No,L),output(L,N

3、o+1)end.getN(N) ->ifN =:= 1 ->1;N =:= 2 ->1,1;N > 2 ->L = getN(N-1), %獲得第N-1行元素process(L) % 通過第N-1行元素,推導(dǎo)出第N行end. process(Ele) -> process(Ele,1,).process(Ele,No,L) ->Len = length(Ele)+1,ifLen =:= No ->Temp = 1|L,lists:reverse(Temp);Len =/= No -&

4、amp;gt;ifNo =:=1 ->process(Ele,No+1,No | L);No =/=1 ->E1 = lists:nth(No-1,Ele),E2 = lists:nth(No,Ele),process(Ele,No+1,E1+E2 | L)endend. 在程序中主要部分我都作了注釋,這完全是按照我的想法來寫的,如果大家對(duì)程序比較苛刻的話,自己回去再精煉一下吧。在Windows下運(yùn)行結(jié)果如下:實(shí)戰(zhàn)2:選擇排序:接口為sort(L),L為輸入數(shù)組。要求:給定一個(gè)無序數(shù)組,用選擇排序法進(jìn)行排序(從小到大),要求將中間過程的每一步都輸出。原理:首先在未排

5、序序列中找到最小元素,存放到排序序列的起始位置,然后,再?gòu)氖S辔磁判蛟刂欣^續(xù)尋找最小元素,然后放到排序序列末尾(目前已被排序的序列)。以此類推,直到所有元素均排序完畢。程序代碼如下:-module(choose_sort).-export(sort/1).sort(L) -> sort(L,).sort(,Ret) ->io:format("Final:pnsort finished.",Ret);sort(L,Ret) ->Min = findMin(L),Minimum = lists:nth(Min,L),

6、NewL = lists:delete(Minimum,L), % 在L中刪除最小元素iflength(Ret) =:= 0 ->Ele = Minimum,io:format("No.p sort:pn",length(Ele),Ele);length(Ret) =/= 0 ->% 使用兩 個(gè)列表逆置的操作是因?yàn)?,要將一個(gè)元素插入列表尾% 注:在Erlang中,將一個(gè)元素到列表頭很簡(jiǎn)單,插入到列表尾好像不直接,因此我用了兩次逆置Temp = lists:reverse(Ret),Ele = lists:reverse(Minim

7、um|Temp),io:format("No.p sort:pn",length(Ele),Ele)end,sort(NewL,Ele).% 找到最小元素位置findMin(L) -> findMin(L,1,1).findMin(L,Start,Loc) ->Ele = lists:nth(Start,L),Minimum = lists:nth(Loc,L),iflength(L) =:= Start ->ifEle < Minimum ->Start;Ele >= Mi

8、nimum ->Locend;length(L) =/= Start ->ifEle < Minimum ->findMin(L,Start+1,Start);Ele >= Minimum ->findMin(L,Start+1,Loc)endend.注:最初我的想法是在原列表L上進(jìn)行選擇排序,但是,在原列表上進(jìn)行選擇排序可能需要交換列表的兩個(gè)元素,在Erlang中,交換列表的兩個(gè)元素沒有直接的方法,因此,,我的最初想法比較繁瑣。上述代碼思想:(1)從列表L中選擇最小元素,然后插入到結(jié)果列表Ret,;(2)將最

9、小元素從L中刪除;(3)遞歸調(diào)用(1)知道L中元素為空,返回結(jié)果Ret為最終排序結(jié)果。程序運(yùn)行結(jié)果如下:實(shí)戰(zhàn)3:集合交與并操作。用列表表示集合,求兩個(gè)集合的交集和并集,例如1,3,4,5和4,5,7,9,10的交集為4,5,并集為1,3,4,5,7,9,10。代碼如下:-module(set).-export(inter/2).-export(union/2).inter(L1,L2) ->S1 = lists:sort(L1),S2 = lists:sort(L2),inter(S1,S2,).inter(S1,S2,Ret) ->Len1 = length(S1

10、),Len2 = length(S2),Log = (Len1 =:=0) or (Len2 =:= 0),ifLog =:= true ->lists:reverse(Ret);Log =/= ture ->F1 = lists:nth(1,S1),F2 = lists:nth(1,S2),ifF1 =:= F2 ->inter(lists:delete(F1,S1),lists:delete(F2,S2),F1|Ret);F1 < F2 ->inter(lists:delete(F1,S1),S2,Ret);F1 &am

11、p;gt; F2 -> inter(S1,lists:delete(F2,S2),Ret)endend.union(L1,L2) ->S1 = lists:sort(L1),S2 = lists:sort(L2),lists:reverse(union(S1,S2,).union(S1,S2,Ret) ->Len1 = length(S1),Len2 = length(S2),Log = (Len1 =/= 0) and (Len2 =/= 0),ifLen1 =:= 0 ->lists:append(Ret,S2);Len2 =:=0

12、->lists:append(Ret,S1);Log =:= true ->F1 = lists:nth(1,S1),F2 = lists:nth(1,S2),ifF1 =:= F2 -> union(lists:delete(F1,S1),lists:delete(F2,S2),F1|Ret);F1 =/= F2 ->Temp = F1|Ret,Temp2 = F2 | Temp,union(lists:delete(F1,S1),lists:delete(F2,S2),Temp2)endend.求集合的交合并操作比較簡(jiǎn)單,交操作主要步驟如下:調(diào)用lists:sort/1對(duì)兩個(gè)列表進(jìn)行排序; 若列表L1或列表L2為空,返回Ret,否則進(jìn)入第三步; 將兩個(gè)列表L1、L2首元進(jìn)行比較,分三種情況,首元相等、大于、小于依次處理。 并操作與交類似,只是在L1或L2為空時(shí)將不空的列表并

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論