需求
将一个数字列表由小到大进行排序
实现
%% list.erl
-module(list).
-export([sortNum/1]).
%% 对纯数字列表排序:从小到大
%% Num:当前的数字,列表中第一个数字
%% List:取出第一个数字后,其余的列表
sortNum([Num|List]) ->
%% 通过列表推导,找到比当前数字小的数字列表
sortNum([X || X <- List, X < Num])
%% 把当前的数字,放在比自己小的数字列表后边
++ [Num] ++
%% 通过列表推导,找到比当前数字大的数字列表
sortNum([X || X <- List, X >= Num]);
%% 排序结束
sortNum([]) -> [].
调用
> erl
> list:sortNum([4,8,5,2,1]).
[1,2,4,5,8]
分析流程
- 调用
list:sortNum([4,8,5,2,1]).
sortNum([4|[8,5,2,1]]) -> %% 通过列表推导,找到比4小的数字列表,得到列表[2,1],等于 `sortNum([2, 1])` sortNum([X || X <- [8,5,2,1], X < 4]) %% 把4放在比自己小的数字列表后边 ++ [1] ++ %% 通过列表推导,找到比4大的数字列表,得到列表[8,5],等于 `sortNum([8,5])` sortNum([X || X <- [8,5,2,1], X >= 4]);
- 调用
sortNum([X || X <- [8,5,2,1], X < 4])
,等于sortNum([2, 1])
sortNum([2|[1]]) -> %% 通过列表推导,找到比2小的数字列表, [1], 调用 sortNum([1]) sortNum([X || X <- [1], X < 2]) %% 把2放在比自己小的数字列表后边 ++ [2] ++ %% 通过列表推导,找到比2大的数字列表, 得到列表 [], 调用 sortNum([]) sortNum([X || X <- [1], X >= 2]);
- 调用
sortNum([X || X <- [1], X < 2])
,等于sortNum([1])
sortNum([1|[]]) -> %% 通过列表推导,找到比1小的数字列表, 得到列表 [], 调用 sortNum([]),返回[] sortNum([X || X <- [], X < 1]) %% 把8放在比自己小的数字列表后边 ++ [1] ++ %% 通过列表推导,找到比1大的数字列表, 得到列表 [], 调用 sortNum([]),返回[] sortNum([X || X <- [1], X >= 1]);
- 调用
sortNum([X || X <- [8,5,2,1], X >= 4])
,等于sortNum([8,5])
sortNum([8|[5]]) -> %% 通过列表推导,找到比8小的数字列表, 得到列表 [5], 调用 sortNum([5]) sortNum([X || X <- [5], X < 8]) %% 把8放在比自己小的数字列表后边 ++ [8] ++ %% 通过列表推导,找到比8大的数字列表, 得到列表 [], 调用 sortNum([]),返回[] sortNum([X || X <- [5], X >= 8]);
- 调用
sortNum([X || X <- [5], X < 8])
,等于sortNum([5])
sortNum([5|[]]) -> %% 通过列表推导,找到比8小的数字列表, 得到列表 [], 调用 sortNum([]),返回[] sortNum([X || X <- [], X < 5]) %% 把5放在比自己小的数字列表后边 ++ [5] ++ %% 通过列表推导,找到比8大的数字列表, 得到列表 [], 调用 sortNum([]),返回[] sortNum([X || X <- [], X >= 5]);
分析结果
流程5
返回[5]
流程4
等于流程5
++[8]
,结果[5]
++[8]
=[5, 8]
流程3
返回[1]
流程2
等于流程3
++[2]
,结果[1]
++[2]
=[1, 2]
流程1
等于流程2
++[4]
++流程4
,结果[1, 2]
++[4]
++[5, 8]
=[1,2,4,5,8]
试一下
有一个列表,里面的元素是商品的名字和价格,从高到低排序
List = [{apple, 120}, {milk,150}, {orange,155}, {paper, 10}, {book, 45}, {pen, 22}, {phone, 900}, {water, 20}]