每日锻炼-3

-module(daily_three).

-export([combine/2]).
-export([bubble/1]).
-export([insert/1]).
-export([nine_table/0, full_table/0]).
-export([median/1]).


%% combine two ordered list
combine(L, []) -> qsort(L);
combine(L1, [H|T]) -> combine([H|L1], T).

qsort([]) -> [];
qsort([H|T]) -> qsort([X || X <- T, X < H]) 
				++ [H] ++
				qsort([X || X <- T, X > H]).


%% Bubble sort
bubble([]) -> [];
bubble(L) -> bubble(L, len(L)).

bubble(L, 0) -> L;
bubble([H|T], N) ->
	L = bubble_once(H, T),
	io:fwrite("Step~p:~p~n", [len([H|T]) - N + 1, L]),
	bubble(L, N - 1).

bubble_once(N, []) -> [N];
bubble_once(N, [H|T]) -> 
	if
		N < H ->
			[N | bubble_once(H, T)];	%% put min value left
		N >= H ->
			[H | bubble_once(N, T)]
	end.

len([]) -> 0;
len([_H|T]) -> 1 + len(T).


%% Insert sort, L1 is ordered list
insert(L) -> insert([], L).

insert(L, []) -> L;
insert(L, [H|T]) -> 
	NewList = insert_once(L, H),
	io:format("~p~n", [NewList]),
	insert(NewList, T).

insert_once([], N) -> [N];
insert_once([H|T], N) -> 
	if
		N < H ->
			[N | [H|T]];
		N >= H ->
			[H | insert_once(T, N)]
	end.


%% nine tables
%% 1*1 = 1
%% 1*2 = 2 2*2=4
%% ***
nine_table() -> nine_table(1, 1).

nine_table(9, 9) -> 
	print_end(9, 9);
nine_table(M, M) ->  
	print_end(M, M),
	nine_table(1, M + 1);
nine_table(M, N) -> 
	print_cell(M, N),
	nine_table(M + 1, N).

print_cell(M, N) -> io:format("~p*~p=~p\t", [M, N, M * N]).
print_end(M, N) -> io:format("~p*~p=~p~n", [M, N, M * N]).

%% nine table2
%% 1*1=1 1*2=2 1*3=3 .... 1*9=9
%% 2*1=2 2*2=4 2*3=6 .... 2*9=18
%% ....
full_table() -> full_table(1, 1).

full_table(9, 9) ->
	print_end(9, 9);
full_table(M, 9) ->
	print_end(M, 9),
	full_table(M + 1, 1);
full_table(M, N) ->
	print_cell(M, N),
	full_table(M, N + 1). 


%% Median number
%% 中位数指一个有序列表或数组的中间位置的数,求中位数时必须保证列表有序,
%% 如果列表长度为奇数,中间位置的数位中位数,若列表为偶数,中间两个数的平均值为中位数
median(L) -> 
	NewList = insert(L),
	Mid = do_mid(NewList),
	io:format("Median number is ~p~n", [Mid]).

do_mid(L) ->
	Len = len(L),
	if
		Len rem 2 =/= 0 ->
			Index = Len div 2 + 1,
			get(Index, L);
		Len rem 2 =:= 0 ->
			Index = Len div 2,
			Num1 = get(Index, L),
			Num2 = get(Index + 1, L),
			(Num1 + Num2)/2.0
	end.

get(_N, []) -> void;
get(1, [H|_T]) -> H;
get(N, [_H|T]) -> get(N - 1, T).


你可能感兴趣的:(erlang)