有没有办法在 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).

没有LeftNodeRightNode 我正在成功创建树结构,但我想将LeftNodeRightNode 保存在循环状态。创建节点时,函数参数应该传入什么?

更新: 感谢 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 进程”映射到新的内核线程

有没有办法浏览 erlang 术语存储 (ETS)

c++如何用非递归的算法去创建二叉树,有没有分层建立二叉树的方法

列出 Erlang 中进程可用的可用记录

如何验证erlang进程是否已休眠?

在C#中使用二叉树实时计算海量用户积分排名的实现