Erlang分布式反向字符串

rax*_*ell 1 erlang

我是Erlang的新手,我不知道如何解决此练习。
我需要通过将长字符串划分为N个子字符串来反转长字符串,反转单个子字符串,然后将它们加入以获得原始字符串的反转。每个子字符串需要通过不同的过程反转。

我的问题是:
1)如何将字符串分成N个大小相等的子字符串?
2)如何加入其他进程收到的字符串?

有人可以给我示例代码吗?这是我所做的,但缺少主要部分:

% This function should split the string, spawn the processes
% and recombine the results
reverse(Str, N) -> % ...

sub_reverse() ->
    receive
        { From, SubStr } -> From ! { self(), lists:reverse(SubStr) }
    end.
Run Code Online (Sandbox Code Playgroud)

小智 5

尝试这样的事情。

-module(stackoverflow).
-export([reverse/2, join/0, sub_reverse/2]).

reverse(Str, N) ->
    % A process joining the reversed substrings.
    JoinPID = spawn(stackoverflow, join, []),

    % The step size is the length of Str divided by N.
    % TODO Handle remainder.
    Step = string:length(Str) div N,

    % The split points are calculated from end to start of Str.
    SplitPoints = lists:seq(string:length(Str) - Step, 0, -Step),

    % For each split point, spwan a process that reverts the substring for the
    % split point.
    lists:foreach(fun(From) ->
                    Substr = string:slice(Str, From, Step),
                    spawn(stackoverflow, sub_reverse, [JoinPID, Substr])
                  end,
                  SplitPoints).

join() ->
    receive
        {reverse_str, ReverseStr} ->
            io:format("~s", [ReverseStr]),
            join()
    end.

sub_reverse(JoinPID, SubStr) ->
    JoinPID ! {reverse_str, lists:reverse(SubStr)}.
Run Code Online (Sandbox Code Playgroud)

编辑

此方法有效,但取决于Spawend流程的顺序。如果它们返回故障,则join()接收零件故障。因此,可能的改进方法是为每个部分加上标签,From从而join()可以按正确的顺序将它们加入。这留给读者练习。