Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
不';是否在erlang中创建新列表?_Erlang - Fatal编程技术网

不';是否在erlang中创建新列表?

不';是否在erlang中创建新列表?,erlang,Erlang,在erlang中,一切都是不可变的,对吗?那么,如果使用append每次都创建一个新副本,那么将元素追加到列表的头部如何不创建列表的新副本呢 引自erlang.org: 在递归和构建列表时,务必确保将新元素附加到列表的开头。这样,您将构建一个列表,而不是不断增长的结果列表的数百或数千个副本 不是每次遍历链表都是不在末尾追加的原因吗?Erlang对列表使用单链表。添加头部不会修改尾部。假设您有一个列表T=[10,50,40]。添加头是[20 | T],结果如图所示。您可以看到,[10,50,40]

在erlang中,一切都是不可变的,对吗?那么,如果使用append每次都创建一个新副本,那么将元素追加到列表的头部如何不创建列表的新副本呢

引自erlang.org:
在递归和构建列表时,务必确保将新元素附加到列表的开头。这样,您将构建一个列表,而不是不断增长的结果列表的数百或数千个副本


不是每次遍历链表都是不在末尾追加的原因吗?

Erlang对列表使用单链表。添加头部不会修改尾部。假设您有一个列表
T=[10,50,40]
。添加头是
[20 | T]
,结果如图所示。您可以看到,
[10,50,40]
零件未更改


我想知道为什么列表中的“++”不是一个好方法?您能详细解释一下吗?列表中的最后一个节点对“下一个”节点的引用为空(显然,最后一个节点不存在)。当两个列表合并时,列表的最后一个节点之一需要引用第二个列表的开头。因为数据在Erlang中是不可变的,所以必须创建一个新的最后一个节点来指向另一个列表的开始。然后,倒数第二个节点必须指向新的“最后一个”节点。总而言之:在
a++b
中,
a
必须完全复制到
b
的前面。并且原始的
a
将根本不会被修改。