分类目录:Erlang

Erlang的递归

通过一个求和(0~N)程序来对比Erlang的递归和尾递归效率并加深对尾递归的理解。 递归 #! /usr/bin/env escript main([A]) -> N = list_to_integer(A), io:format("sum 0 - ~w = ~w~n",[N, sum(N)]). sum(1) -> 1; sum(N) -> N + sum(N-1). 尾递归 #! /usr/bin/env escript main([A]) -> N = list_to_integer(A), io:format("sum 0 - ~w = ~w~n",[N, sum(N)]). sum(N) -> sum(N, 0). sum(0, N) -> N; sum(M, N) -> sum(M-1, N+M). 对比 执行 0 ~ 1000000求和表现 (时间 & 内存消耗): dingkaideMacBook-Pro:erlang dingkai$ time ./sum 1000000 sum 0 - 1000000 = 500000500000 real 0m4.261s user 0m3.156s sys 0m0.775s 内存消耗约为600MB dingkaideMacBook-Pro:erlang dingkai$ time ./sum_tail 1000000 sum 0 - 1000000 = 500000500000 real 0m2.677s user 0m2.493s sys 0m0.177s 内存消耗约为16MB 总结 尾递归函数就是在递归调用前不累计任何未决运算的函数。如果函数子句中函数体的最后一个表达式是对自身的调用或者是个常数,那么它就是尾递归子句。如果一个函数的所有子句都是尾递归子句,那么它就是一个尾递归函数。

Erlang入门: 几个简单小程序

生成斐波那契数列 #! /usr/bin/env escript main([A]) -> I=list_to_integer(A), F=fac_list(I), io:format("feribo ~w = ~w~n",[I,F]). element(1) -> 1; element(2) -> 1; element(N) -> element(N-1) + element(N-2). fac_list(N) -> fac_list([], N). fac_list(L, 0) -> L; fac_list(L, N) -> fac_list([element(N)|L], N-1). 运行结果 dingkaideMacBook-Pro:erlang dingkai$ ./feibo 25 feribo 25 = [1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368,75025] 求平均数 #! /usr/bin/env escript %main([L]) -> main([]) -> L = [1, 2, 3], io:format("list = ~w~n", [L]), Avgrage = count_average(L), io:format("avrage of ~w = ~w~n",[L,Avgrage]). num([]) -> 0; num([H|T]) -> 1+num(T). sum([]) -> 0; sum([H|T]) -> H + sum(T). count_average([]) -> 0; count_average(L) -> sum(L)/num(L). 运行结果 dingkaideMacBook-Pro:erlang dingkai$ ./avg ./avg:11: Warning: variable 'H' is unused list = [1,2,3] avrage of [1,2,3] = 2.0 求N个数的平方和 #! /usr/bin/env escript main([A]) -> N = list_to_integer(A), SquareSum = sum_square(N),…