如何交换矩阵Erlang中第一行的第二个元素和最后一行的倒数第二个元素?

mnemlml8  于 2023-06-20  发布在  Erlang
关注(0)|答案(1)|浏览(186)

产品名称:给出了N维的方阵。编写解决单个任务的两个实现:
1.- 基于在单独的过程中子任务的执行-对于矩阵的行中的N次迭代;
1.基于一个过程中的顺序编程-沿着矩阵的行进行2N次迭代。在这两种实现中,不应使用计数器。
我的个人任务是交换第一行的第二个元素和最后一行的倒数第二个元素。
我能够通过矩阵并替换第一行和最后一行的第一个元素,但如何为第一行的第二个元素和最后一行的倒数第二个元素做这件事-对我来说很难。
任何帮助,即使只是方向的想法,将不胜感激。

-module(mtr).
-export([main1/1, main2/1, swap1/1, swap2/1, mtr_gn1/1]).

%% ver.1
%% (N) -> NewMatrix
main1(N) ->
    timer:tc(mtr, swap1, [mtr_gn1(N)]).

swap1([[A|R1]|Rs]) ->
    Pid = self(),
    spawn(mtr1, ch, [Rs, A, Pid]),
    receive
        {z, Z} -> Z
    end,
    receive
        {list, L1} -> L1
    end,
    [[Z|R1]|L1].

%% ver.2
main2(N) ->
    timer:tc(mtr, swap2, [mtr_gn1(N)]).

swap2([[A|R1]|Rs]) ->
    [Z|_Rz] = lists:last(Rs),
    [[[Z|R1]]|ch2(Rs, A)].

ch2([[_Z|Rz]], A) ->
    [[A|Rz]];
ch2([R|Rs], A) ->
    [R|ch2(Rs, A)].

mtr_gn1(N) ->
    [lists:map(fun(X) -> X/100 end, lists:seq(1, N)) |
     [[R || R <- lists:seq(1, N)] || _K <- lists:seq(1, N-1)]].

-module(mtr1).
-export([ch/3]).

%% ver.1
ch(L, A, Pid) ->
    Pid ! {list, ch1(L, A, Pid)}.

ch1([[Z|Rz]], A, Pid) ->
    Pid ! {z, Z},
    [[A|Rz]];
ch1([X|L], A, Pid) ->
    [X|ch1(L, A, Pid)].
nr7wwzry

nr7wwzry1#

我认为N次迭代是不可能的,所以我在单独的过程中进行了N+1次迭代(这是主要任务):
模块1:

-module(mtr).
-export([main1/1, main2/1, swap1/1, swap2/1, mtr_gn1/1]).

mtr_gn1(N) ->
    [lists:map(fun(X) -> X/100 end, lists:seq(1, N)) |
    [ [R||R <- lists:seq(1, N)] || _K<- lists:seq(1,N-1)]].

main1(N) -> 
    timer:tc(mtr, swap1, [mtr_gn1(N)]).

swap1([[A, B|R1]|Rs]) -> 
    Pid = self(),
    spawn(mtr1, ch, [Rs,B,Pid]),
    receive
    {z, Z} -> Z
    end, receive
    {list, L1} -> L1 end,
    [[A,Z|R1]|L1].

main2(N) -> 
    timer:tc(mtr, swap2, [mtr_gn1(N)]).

swap2([[A, B |R1]|Rs]) -> 
    [_Z, P|_Rz] = lists:reverse(lists:last(Rs)), 
    [[A, P|R1]|ch2(Rs,B)].

ch2([[Z|Rz]],A) ->
    [swap_penultimate([Z|Rz], A, [])];

ch2([R|Rs],A) ->
    [R|ch2(Rs,A)].

swap_penultimate([_Z,Y], A, Acc) -> 
    Acc ++ [A, Y];
    
swap_penultimate([H|T], A, Acc) ->
    swap_penultimate(T, A, Acc ++ [H]).

模块2:

-module(mtr1). 
-export([ch/3]).

ch(L,A,Pid) ->
    Pid ! {list, ch1(L,A,Pid)}. 

ch1([[Z | Rz]], A, Pid) -> 
    [swap_penultimate([Z | Rz], A, Pid, [])];

ch1([X|L],A,Pid) ->
    [X|ch1(L,A,Pid)].

swap_penultimate([Z,Y], A, Pid, Acc) -> 
    Pid ! {z, Z},
    Acc ++ [A, Y];

swap_penultimate([H|T], A, Pid, Acc) ->
    swap_penultimate(T, A, Pid, Acc ++ [H]).

相关问题