我在erlang中编写quicksort时遇到问题.我正在做的是我产生两个进程,然后阻止当前进程,直到我从左右子阵列得到响应.获取这两个响应后,我向其父级发送一条消息,为其提供计算列表.Parent ! {self(), Lone ++ [H] ++ Ltwo}
但是我在两个子流程中都遇到了取消undef的错误.这是代码.
quick(Parent, []) -> Parent ! {self(), []};
quick(Parent, [H | T]) ->
Pone = spawn_link(main, quick, [ self(), [ X || X <- T, H >= X ] ]) ,
Ptwo = spawn_link(main, quick, [ self(), [ Y || Y <- T, H < Y ] ]) ,
receive
{Pone, Lone} ->
receive
{Ptwo, Ltwo} -> Parent ! {self(), Lone ++ [H] ++ Ltwo}
end;
{Ptwo, Ltwo} ->
receive
{Pone, Lone} -> Parent ! {self(), Lone ++ [H] ++ Ltwo}
end
end.
sortquick(List) ->
quick(self(), List).
Run Code Online (Sandbox Code Playgroud)
称为:
main:sortquick([12,4,7,22,25]).
Run Code Online (Sandbox Code Playgroud)
Oli*_*ves 12
代码本身不是问题.快速排序工作正常.原因可能是你在子进程中获得undef的原因是因为函数quick/2根本没有被导出.当您使用模块和函数调用spawn_link时,需要导出该函数.
您可以通过添加来修复此问题
-export([quick/2]).
Run Code Online (Sandbox Code Playgroud)
或者通过将spawn_links更改为类似的东西
spawn_link(fun() -> quick(Self, [Y || Y <- T, H < Y]) end
Run Code Online (Sandbox Code Playgroud)
虽然如果你采用后一种方式,你需要创建一个变量
Self = self()
Run Code Online (Sandbox Code Playgroud)
在你打电话之前,否则它不会回到正确的过程.