gpt4 book ai didi

list - 在 Erlang 中获取衍生函数的结果

转载 作者:行者123 更新时间:2023-12-04 06:29:48 25 4
gpt4 key购买 nike

我目前的目标是编写 Erlang 代码来计算 N 个元素的列表,其中每个元素都是其“索引”的阶乘(因此,对于 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 最终返回一个阶乘列表。但问题是,我不知道如何得到那个列表,如何得到它返回的内容?至于现在我的代码返回正常,因为这是 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}]

关于list - 在 Erlang 中获取衍生函数的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20339937/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com