我目前的目标是编写计算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(这是我的阶乘列表)中得到结果?如果我的代码根本不对,我会问一个如何让它变得更好的建议.提前致谢.
我的方法是如何完成这类任务
-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}]