上节我们主要从最基本的程序入手,给出一些程序的Erlang代码,本文继续探讨Erlang程序。
练习1:求和!
sum/1用于求前N个元素的和,sum(N,M)/2用于求从N到M之间所有元素的和,当N>M时,终止。代码如下:
-module(sum). -export([sum/1,sum/2,sum_compute/2]). element(1) -> 1; element(N) -> element(N-1) + 1. sum(1) -> 1; sum(N) -> sum(N-1) + element(N). sum_compute(N,M) -> sum(M)-sum(N)+N. sum(N,M) -> if N=<M -> sum_compute(N,M); N>M -> io:format("N>M,return error!~n",[]) end.
练习2:创建列表。
比较简单,直接上代码:
-module(list_create). -export([create/1,reverse_create/1]). reverse(L) -> reverse(L,[]). reverse([],L) -> L; reverse([H|T],L) -> reverse(T,[H|L]). create(N) -> create([],N). create(L,0) -> L; create(L,N) -> create([N|L],N-1). reverse_create(N) -> reverse(create(N)).
练习3:输出满足条件的数。
比较简单,直接上代码:
-module(show_num). -export([print/1,print/2,print_even/1,print_even/2]). print(N) -> io:format("Number:"), print(1,N). print(N,N) -> io:format("~p~n",[N]); print(First,N) -> io:format("~p,",[First]), print(First+1,N). print_even(N) -> io:format("Number:"), print_even(1,N). print_even(N,N) -> if N rem 2 =:=0 -> io:format("~p~n",[N]); N rem 2 =:=1 -> io:format("End!~n") end; print_even(First,N) -> if First rem 2 =:= 0 -> io:format("~p,",[First]),print_even(First+1,N); First rem 2 =:=1 -> print_even(First+1,N) end.
练习4:汉诺塔。
运用递归的思想,比较简单,代码如下:
-module(hanoi). -export([hanoi/1,move/4]). %%There are N tower in Building A that must move to Building C via Building B. hanoi(N) -> move(N,A,B,C). move(1,A,B,C) -> io:format("Move disk 1 from A to C.~n"); move(N,A,B,C) -> move(N-1,A,C,B), io:format("Move disk ~p from ~p to ~p~n",[N,A,C]), move(N-1,B,C,A).
练习5:求1-2+3-4+5-6+...+n。
也比较简单,在偶数处加,奇数处减,代码如下:
-module(cross_arith). -export([add/1,add/2,element/1]). element(1) -> 1; element(N) -> element(N-1) + 1. add(N) -> add(N,0). add(1,Sum) -> Sum + 1; add(N,Sum) -> A=element(N), if A rem 2 =:=0 -> add(N-1,Sum-element(N)); A rem 2 =:=1 -> add(N-1,Sum+element(N)) end.
本文在上文的基础上继续探讨了一些基本的Erlang程序,通过这些程序你应该能发现Erlang在编写程序时的简洁性了。下节将探讨冒泡排序、插入排序以及一些趣味问题,如打印九九乘法表等。(注:由于个人能力有限,有些地方难免繁琐或者有疏漏,不吝赐教。)