在Erlang中获取生成函数的结果

 红箭777_387 发布于 2023-02-13 12:42

我目前的目标是编写计算N个元素列表的Erlang代码,其中每个元素都是它的"索引"的因子(因此,对于N = 10,我想得到[1!,2!,3!, ......,10!]).更重要的是,我希望每个元素都能在一个单独的过程中计算出来(我知道它只是效率低下,但我希望能够实现它并将其效率与其他方法进行比较).

在我的代码中,我想使用一个函数作为给定N的"循环",对于N,N-1,N-2 ...产生一个计算阶乘(N)并将结果发送到某些"收集"的过程"函数,将收到的结果打包到列表中.我知道我的概念可能过于复杂,所以希望代码可以解释一下:

messageFactorial(N, listPID) ->
    listPID ! factorial(N).      %% send calculated factorial to "collector".

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
nProcessesFactorialList(-1) ->
    ok;
nProcessesFactorialList(N) ->
    spawn(pFactorial, messageFactorial, [N, listPID]),   %%for each N spawn...
    nProcessesFactorialList(N-1).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
listPrepare(List) ->            %% "collector", for the last factorial returns
    receive                     %% a list of factorials (1! = 1).
        1 -> List;
        X ->
            listPrepare([X | List])
    end.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
startProcessesFactorialList(N) ->
    register(listPID, spawn(pFactorial, listPrepare, [[]])),
    nProcessesFactorialList(N).

我想它会起作用,我的意思是listPrepare最终会返回一个阶乘列表.但问题是,我不知道如何获得该列表,如何获得它返回的内容?至于现在我的代码返回ok,因为这是nProcessesFactorialList在完成时返回的内容.我想到最后将listPrepare的结果列表发送到nProcessesFactorialList,但是它还需要是一个注册过程,我不知道如何恢复该列表.

基本上,如何从注册过程运行listPrepare(这是我的阶乘列表)中得到结果?如果我的代码根本不对,我会问一个如何让它变得更好的建议.提前致谢.

1 个回答
  • 我的方法是如何完成这类任务

    -module(par_fact).
    
    -export([calc/1]).
    
    fact(X) -> fact(X, 1).
    
    fact(0, R) -> R;
    fact(X, R) when X > 0 -> fact(X-1, R*X).
    
    calc(N) ->
        Self = self(),
        Pids = [ spawn_link(fun() -> Self ! {self(), {X, fact(X)}} end)
                || X <- lists:seq(1, N) ],
        [ receive {Pid, R} -> R end || Pid <- Pids ].
    

    结果:

    > par_fact:calc(25).
    [{1,1},
     {2,2},
     {3,6},
     {4,24},
     {5,120},
     {6,720},
     {7,5040},
     {8,40320},
     {9,362880},
     {10,3628800},
     {11,39916800},
     {12,479001600},
     {13,6227020800},
     {14,87178291200},
     {15,1307674368000},
     {16,20922789888000},
     {17,355687428096000},
     {18,6402373705728000},
     {19,121645100408832000},
     {20,2432902008176640000},
     {21,51090942171709440000},
     {22,1124000727777607680000},
     {23,25852016738884976640000},
     {24,620448401733239439360000},
     {25,15511210043330985984000000}]
    

    2023-02-13 12:46 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有