`
junfeng_feng
  • 浏览: 20342 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Erlang 练习题

 
阅读更多
-module(exam).
-compile(export_all).

%1杨辉三角
start(N) when is_integer(N) ->
        print(N,1,1).

%C表示行数
%LC表示C对应的list
print(N,1,_) ->
        io:format("~p~n",[[1]]),
        print(N,2,1);
print(N,2,_) ->
        io:format("~p~n",[[1,1]]),
        print(N,3,[1,1]);
%Lc_minus_1 表示C-1行的list
print(N,C,Lc_minus_1) ->
    if
        C =:= (N + 1) ->
            ok;
        true    ->
            LC = get_increment(C,Lc_minus_1,[1]),
            io:format("~p~n",[LC]),
            print(N,C+1,LC)
    end.

%L 是 N-1行 的列表
%Result结果是 N行 的列表
get_increment(N,L,Result) ->
    Len = length(Result), 
    if
        Len =:= N-1 -> [1|Result];
        true ->
            get_increment(N,L,[lists:nth(Len,L) + lists:nth(Len+1,L) | Result])
    end.


%2 选择排序
select_sort(L) ->
    select_sort_impl(L,[]).

select_sort_impl([],_) ->
    io:format("~n");
select_sort_impl(L,Result) ->
    {Pos,Value} = get_min(L),
    L_new = lists:sublist(L,Pos-1) ++ lists:sublist(L,Pos+1,length(L)-Pos+1),
    Result_new = Result ++ [Value],
    io:format("~p~n",[Result_new ++ L_new]),
    select_sort_impl(L_new,Result_new).

get_min([]) ->
    error;
get_min(L) ->
    %第一次取第一个元素为初始最小值
    get_min_impl(L,1,1,lists:nth(1,L)).

%获得list最小元素的{位置,值}
%Idx 表示遍历到当前list的第几个
get_min_impl([],_,Pos,Value) ->
    {Pos,Value};
get_min_impl(L,Idx,Pos,Value) ->
    [H|T] = L,
    if
        H < Value ->
            get_min_impl(T,Idx+1,Idx,H);
        true      ->
            get_min_impl(T,Idx+1,Pos,Value)
    end.

%3
%交集
insect(L1,L2) ->
    lists:sort(insect_impl(lists:sort(L1),lists:sort(L2),[])).

insect_impl(L1,L2,Result) ->
    if
        L1 =:= [];
        L2 =:= [] ->
            Result;
        true ->
            [H1|T1] = L1,
            [H2|T2] = L2,
            if
                H1 =:= H2 ->
                    insect_impl(T1,T2,[H1|Result]);
                H1 <   H2 ->
                    %pass H1
                    insect_impl(T1,L2,Result);
                true      ->
                    %pass H2
                    insect_impl(L1,T2,Result)
            end
    end.

%并集
union(L1,L2) ->
    lists:sort(union_impl(lists:sort(L1),lists:sort(L2),[])).
union_impl(L1,L2,Result) ->
    if
        L1 =:= [] ->
            [L2|Result];
        L2 =:= [] ->
            [L1|Result];
        true ->
            [H1|T1] = L1,
            [H2|T2] = L2,
            if
                H1 =:= H2 ->
                    insect_impl(T1,T2,[H1|Result]);
                true      ->
                    insect_impl(T1,T2,[H1|[H2|Result]])
            end
    end.

%4
start(Alg, CacheSize) ->
    case Alg of 
        lru ->
            lru(CacheSize);
        lfu ->
            lfu(CacheSize)
    end.

lru(CacheSize) ->
    {ok,S} = file:open("production-build00-2-4K.req",[read]),
    lru_impl(S,CacheSize,[]),
    file:close(S),
    ok.
    
lru_impl(S,CacheSize,Cache) ->
    R = file:read_line(S),
    if
        R == eof ->
            ok;
        true    ->
            {ok,Line_} = R,
            %删除\n
            Line = string:sub_string(Line_,1,length(Line_)-1),
            [_,_,Id] = string:tokens(Line," "),

            case lists:member(Id,Cache) of 
                true ->
                    Cache_new = Cache;
                false ->
                    Len = length(Cache),
                    if
                        Len < CacheSize ->
                            Cache_new = [Id|Cache];
                        true            ->
                            %lru
                            Cache_new = [Id|lists:sublist(Cache,CacheSize-1)]
                    end
            end,
            io:format("LRU Cache:~p~n",[Cache]),
            lru_impl(S,CacheSize,Cache_new)
   end.

lfu(CacheSize) ->
    {ok,S} = file:open("production-build00-2-4K.req",[read]),
    lfu_impl(S,CacheSize,[]),
    file:close(S),
    ok.

lfu_impl(S,CacheSize,Cache) ->
    R = file:read_line(S),
    if
        R == eof ->
            ok;
        true    ->
            {ok,Line_} = R,
            %删除\n
            Line = string:sub_string(Line_,1,length(Line_)-1),
            [_,_,Id] = string:tokens(Line," "),

            %tuple格式{id,count}
            Tuple = lists:keyfind(Id,1,Cache),
            if
                %不存在Id
                Tuple =:= false ->
                    Len = length(Cache),
                    if
                        Len < CacheSize ->
                            Cache_new = [{Id,1}|Cache];
                        true            ->
                            %lfu
                            %按count升序排列
                            [_|Cache_sorted_tail] = lists:keysort(2,Cache),
                            Cache_new = [{Id,1}|Cache_sorted_tail]
                    end;
                %存在id,count+1
                true ->
                     {_,Count} = Tuple,
                     Cache_new = lists:keystore(Id,1,Cache,{Id,Count+1})
            end,
            io:format("LFU Cache:~p~n",[Cache_new]),
            lfu_impl(S,CacheSize,Cache_new)
   end.

分享到:
评论

相关推荐

    ERLANG测试题

    从给定的Erlang测试题中,我们可以提炼出一系列重要的Erlang编程知识点,包括ETS表类型、列表操作、进程通信与监控、模块功能、模式匹配、异常处理、记录结构以及网络编程。 ### ETS表类型 在Erlang中,**ETS ...

    xiandiao_erlang_Erlang课后习题_

    "xiandiao_erlang_Erlang课后习题_"这个压缩包文件包含了Erlang程序设计第二版的课后习题源码,这对于学习和深入理解Erlang编程至关重要。 Erlang的特点: 1. **函数式编程**:Erlang基于函数式编程范式,强调无副...

    Erlang编程指南

    “即便我已经使用Erlang多年,在编程的时候仍然需要参考《Erlang编程指南》。不同层次的Erlang程序员都会发现本书是有价值的学习和参考资料..., 《Erlang编程指南》每章末尾都提供了练习题,并且由简单的示例贯穿全书。

    Eralng笔试题

    ### Erlang 编程练习题解析 #### Q1:编写一个函数 `sum/2`,该函数接收两个整数 `N` 和 `M`(其中 `N` 小于等于 `M`),返回 `N` 和 `M` 之间的所有整数之和。如果 `N` 大于 `M`,则返回错误。 **示例:** ```...

    Learn You Some Erlang for Great Good!

    本书强调了通过实践来掌握知识的重要性,因此在讲解每个概念时,都伴随着实例代码和练习题。它还以有趣的插图来点缀内容,降低了学习的难度和枯燥性。《Learn You Some Erlang for Great Good!》不仅适合于对Erlang...

    erlang资源

    这个“erlang资源”压缩包显然包含了一系列学习Erlang编程语言的材料,这可能是教程文档、代码示例、讲义或者练习题。以下是一些关于Erlang的关键知识点,以及可能在这些资源中找到的相关内容: 1. **函数式编程**...

    erlings:小练习让您习惯于阅读和编写Erlang代码

    练习题 练习分为5个部分。 阅读要完成它们。一定要 ,但是您可以根据自己的意愿随意做。 首先单击下面的练习之一或运行: $ make A.顺序编程 过滤值 你好,世界 你好模式 清单 撤销 删除连续 偶数斐波那契数 减少...

    kent-erlang-mooc

    在 **kent-erlang-mooc-master** 这个压缩包中,可能包含了课程的讲义、示例代码、练习题和项目材料。学习者可以通过这些资源深入理解Erlang的理论知识和实践技巧,逐步掌握构建高效并发系统的技能。通过这门课程,...

    erlang-exercises:一系列 Erlang 练习,展示了该语言的一些基础知识

    二郎练习 01 - pi.erl - 计算 pi 的值到小数点后 5 位。 02 - list.erl - 删除重复项并计算列表的长度。 还有另一个函数可以读取文件并删除重复项并计算列表的长度。 03 - charcount.erl - 在不使用多个进程的情况...

    kent-classes:肯特大学的 Erlang 课堂 (https

    在【kent-classes-master】这个压缩包中,可能包含的是课程的讲义、练习题、示例代码和解决方案,以及可能的讨论论坛链接或视频讲座。学习者可以通过这些材料了解Erlang的基础语法、并发编程技术、OTP框架的应用,...

    电信机务员考试(理论练习题).pdf

    3. **话务量**:用A=CT(Erl)公式表示,其中A代表话务量,C是呼叫次数,T是通话时间,单位是Erlang。 4. **GSM900频段**:上行890-915MHz,下行935-960MHz,射频带宽200kHz,双工距离45MHz,共有124个信道。 5. *...

    programming-elixir-exercises:《Programming Elixir book》练习题

    在“programming-elixir-exercises-master”这个压缩包中,你可以找到一系列与《Programming Elixir》书中的练习题相关的源代码文件。这些练习将覆盖Elixir语言的多个关键领域,包括但不限于: 1. **模式匹配**:...

    移动通信原理习题.doc

    移动通信原理习题 Chapter 3 1、证明对六边形系统,同频复用因子为,其中. 2、一个FDD 蜂窝电话系统分配有24MHz总带宽,并使用两个30kHz信道来提供全双工语音和控制信道 。设每个小区电话用户的业务量为0.1 Erlang。...

    E语言51发文章.rar

    【标题】:“E语言51发文章.rar”指的...文章可能还包含了练习题和解答,以便读者检验自己的理解和技能。 以上就是从给定的信息中可以提取的相关知识点,对于想深入学习E语言的人来说,这个压缩包会是一个宝贵的资源。

    通信网性能分析基础第二章习题答案.doc

    - **习题2-4**: 本题要求证明两个独立随机变量X和Y的和Z的母函数等于X和Y的母函数的乘积。这个结论对于理解和应用母函数是非常重要的。 #### 三、爱尔兰分布 ##### 3.1 爱尔兰分布定义 **定义**: 爱尔兰分布...

    数据、模型与决策(运筹学)课后习题和案例答案014s最新(常用版).doc

    二、M/M/s Model( Erlang C Model) *系统的平均繁忙时间= (1 - Pk) / s *Avg fraction of time that servers are busy = (1 - Pk) / s *Pk是系统满载的概率,也是到达顾客被拒绝服务的概率 三、Queueing System ...

    通信网性能分析基础第三章习题答案(北邮苏驷希.doc

    ### 通信网性能分析基础第三章习题答案解析 #### 题目3-1:证明公式 **题目描述:** 证明以下等式:\[ asB_k(a) = \sum_{s=1}^{k} (a^s / s!) - \sum_{s=0}^{k-1} (a^s / s!) \] **证明过程:** \[ \begin{align*...

    通信网理论分析基础-第四-章习题答案.doc

    ### 通信网理论分析基础-第四章习题答案解析 #### 题目4.1:求解总呼叫量及总呼损 **题目描述**: 已知一个通信网络中的呼叫到达过程,需要求解该网络的总呼叫量以及总的呼叫损失率。 **解答过程**: 已知 \( R =...

    通信网 北邮 苏驷希课后答案

    例如,3-1 和 3-2 题目的证明涉及到了数学推导,可能包含概率论和统计学的知识,特别是Erlang分布,它是话务量分析中的重要工具,用于描述呼叫到达和服务的随机过程。Erlang公式可以帮助我们计算在给定的呼叫量和...

    【运筹学】第六章排队论习题集与答案解析.doc

    爱尔朗分布(Erlang distribution)是负指数分布的组合形式,常用于多个服务过程的总时间。 队长(Queue Length)是指等待服务的顾客数量,排队长(Line Length)通常与队长同义。等待时间(Waiting Time)是从顾客...

Global site tag (gtag.js) - Google Analytics