有没有办法在 Erlang 中使用进程创建二叉树?
Posted
技术标签:
【中文标题】有没有办法在 Erlang 中使用进程创建二叉树?【英文标题】:Is there a way to create a binary tree in Erlang using processes? 【发布时间】:2021-10-05 08:51:42 【问题描述】:我正在尝试使用进程创建二叉树。
-module(binarytree).
-export([start/1, loop/2]).
start(N) ->
P = spawn(?MODULE, loop, [N, self(), self(), self()]),
P ! create_nodes,
receive
end.
loop(0, _, _, _) ->
done;
loop(N, Root, LeftNode, RightNode) ->
receive
create_nodes ->
MyPid = self(),
LeftNode = spawn(?MODULE, loop, [N-1, MyPid, ???, ???]),
RightNode = spawn(?MODULE, loop, [N-1, MyPid, ???, ???]),
LeftNode ! create_nodes,
RightNode ! create_nodes;
_ ->
ok
end,
loop(N, Root, LeftNode, RightNode).
没有LeftNode
和RightNode
我正在成功创建树结构,但我想将LeftNode
和RightNode
保存在循环状态。创建节点时,函数参数应该传入什么?
更新: 感谢 Nalin Ranjan。 更改这些行:
MyPid = self(),
LeftNode = spawn(?MODULE, loop, [N-1, MyPid, ???, ???]),
RightNode = spawn(?MODULE, loop, [N-1, MyPid, ???, ???]),
LeftNode ! create_nodes,
RightNode ! create_nodes;
收件人:
MyPid = self(),
NewLeftNode = spawn(?MODULE, loop, [N-1, MyPid, "", ""]),
NewRightNode = spawn(?MODULE, loop, [N-1, MyPid, "", ""]),
NewLeftNode ! create_nodes,
NewRightNode ! create_nodes,
loop(N, Root, NewLeftNode, NewRightNode);
【问题讨论】:
首先,您的代码将在以下几行崩溃:- ``` ... LeftNode = spawn(?MODULE, loop, [N-1, MyPid, ???, ?? ?]), RightNode = spawn(?MODULE, loop, [N-1, MyPid, ???, ???]), ... ```即使你可以在替换后编译它???( s)... 是的,如果我在循环状态下传递 4 个参数,它就会崩溃。但是,如果我将参数更改为仅 N 和 Parent,则代码编译和进程会像树一样创建。我的问题是我不能将 LeftNode 和 RightNode 作为参数传递,因为它们尚未创建。 但是在创建孩子(左或右)时,您想将孩子保存在孩子本身的状态中?? 好的,如果我不保存状态的孩子,那么一个节点如何知道他的孩子的pid? 创建节点时,它可能没有任何子节点。所以,我们必须首先准备创建一个左右为空的节点。 【参考方案1】:loop(N, Root, LeftNode, RightNode) ->
receive
create_nodes ->
MyPid = self(),
NewLeftNode = spawn(?MODULE, loop, [N-1, MyPid, "empty-child-node", "empty-child-node"),
NewRightNode = spawn(?MODULE, loop, [N-1, MyPid, "empty-child-node", "empty-child-node"]),
NewLeftNode ! create_nodes,
NewRightNode ! create_nodes,
loop(N, Root, NewLeftNode, NewRightNode);
_ -> ok
end,
loop(N, Root, LeftNode, RightNode).
试试这个。
【讨论】:
是的,这行得通。我更新了我的第一篇文章,并将您的答案标记为已接受。 谢谢你.. :-)以上是关于有没有办法在 Erlang 中使用进程创建二叉树?的主要内容,如果未能解决你的问题,请参考以下文章
Erlang - 将每个“erlang 进程”映射到新的内核线程