《Erlang 程序设计》练习答案 -- 第四章 模块与函数

% (1).扩展 geometry.erl 添加一些子句来计算圆和直角三角形的面积。
% 添加一些子句来计算各种几何图形的周长

-module(geometry).
-export([area/1]).

area({rectangle, Width, Height}) ->
    Width * Height;
area({square, Side}) ->
    Side * Side;
% 计算圆面积
area({round, Radius}) ->
    3.1415 * Radius * Radius.

《Erlang 程序设计》练习答案 -- 第四章 模块与函数_第1张图片


% (2).内置函数 tuple_to_list(T) 能将元组T里的元素转换成一个列表。
% 请编写一个名为 my_tuple_to_list() 的函数来做同样的事。
% 不要使用内置函数

-module(mytupletolist).
%-export([my_tuple_to_list/1, my_tuple_to_list/4]). 注意不能这么写
-export([my_tuple_to_list/1]).

% T是元组,F是伐值=>0,L是列表
my_tuple_to_list(T) ->
    my_tuple_to_list(T, tuple_size(T), 0, []).
my_tuple_to_list(T, Index, F, L) when Index > F ->
    my_tuple_to_list(T, Index-1, F, [element(Index, T) | L]);
my_tuple_to_list(T, Index, F, L) when Index =:= F ->
    L.


% (3).查看 erlang:now/0、erlang:data/0 和 erlang:time/0 的定义。
% 编写一个名为 my_time_func(F) 的函数,让它执行 fun F 并记下执行时间。
% 编写一个名为 my_date_string() 的函数,用它把当前的日期和时间改成整齐的格式

-module(mytimefunc).
-export([my_time_func/1, my_date_string/0]).

my_time_func(F) ->
    %{MegaSecs1, Secs1, MicroSecs1} = erlang:now(),
    {Hour1, Minute1, Second1} = erlang:time(),
    F,
    %{MegaSecs2, Secs2, MicroSecs2} = erlang:now(),
    {Hour2, Minute2, Second2} = erlang:time(),
    io:format("runtime:~f~n", [((Hour2-Hour1)/3600+(Minute2-Minute1)/60+(Second2-Second1))/1000]).

my_date_string() ->
    {Year, Month, Day} = erlang:date(),
    {Hour, Minute, Second} = erlang:time(),
    io:format("~p年~p月~p日:~p时~p分~p秒~n", [Year, Month, Day, Hour, Minute, Second]).

% (4).高级练习,查找Python datetime 模块手册页。找出Python的datetime类里有多啊函数哦啊方法
% 可以通过erlang模块里有关时间的内置函数实现。在erlang的手册页里查找等价的函数。
% 如果有明显的遗漏,就实现它。

戳 这里 查看相关模块,也可以在python shell中输入 import datetime 后,再输入 help(datetime) 查看相关模块。
这个问题就不一一实现了,大家感兴趣可以去看看。


% (5).编写一个名为 math_functions.erl 的模块,并导出函数 even/1 和 odd/1。
% even(X) 函数应当是偶整数时返回 true,否则返回false。odd(X)应当在 X 是奇整数时返回 flase

-module(mathfunctions).
-export([even/1, odd/1]).

even(X) when is_integer(X) ->
    case (X rem 2 =:= 0) of
        true -> true;
        false -> false
    end.

odd(X) when is_integer(X) ->
    case (X rem 2 =/= 0) of
        true -> true;
        false ->false
    end.

% (6).向 math_functions.erl 添加一个名为 filter(F, L) 的高阶函数,
% 它返回 L 里所有符合条件的元素 X (条件是F(X)为true)

-module(mathfunctions).
-export([filter/2]).

filter(F, L) ->
    [X || X <- L, F(X) =:= true].

这里写图片描述


% (7).向 math_functions.erl 添加一个返回{Even,Odd}的split(L)函数,
% 其中 Even 是一个包含 L 里所有偶数的列表,Odd是一个包含L里所有技术的列表。
% 请用两种不同的方式编写这个函数,一种使用归集器,另一种使用在联系6中编写的filter函数。

-module(mathfunctions).
-export([split/1]).

%归集器版本,只遍历一遍,但结果是反的
%split(L) ->
%    split(L, [], []).
%split([H|L], Odd, Even) ->
%    case (H rem 2 =:= 0) of
%        true -> split(L, Odd, [H|Even]);
%        false -> split(L, [H|Odd], Even)
%    end;
%split([], Odd, Even) ->
%    {Even, Odd}.

%遍历两遍
split(L) ->
    Odd = [X || X <- L, (X rem 2) =/= 0],
    Even = [X || X <- L, (X rem 2) =:= 0],
    {Even, Odd}.

归集器
归集器版本

列表生成器
列表生成器

你可能感兴趣的:(Erlang)