我正在写一本关于Erlang的书的例子。这是任务:不使用BIF编写反向函数。
这是我所做的:
reverse([H | T]) -> [reverse(T) | [H]];
reverse([]) -> [].
Run Code Online (Sandbox Code Playgroud)
这是此函数返回的内容:
(emacs@localhost)3> examples:reverse([1, 2, 3]).
[[[[],3],2],1]
Run Code Online (Sandbox Code Playgroud)
我不明白如何使它返回扁平化列表[3, 2, 1]。有可能吗?
在语法[H | T]中,H是一个元素,T是一个列表(至少对于proplist而言),在您的代码中[reverse(T) | [H]]创建一个列表,该列表的第一个元素是结果reverse(T),而最后一个尾部是单个元素list [H]。
如果要通过这种方式实现功能,则应使用fenollp提出的语法。
如果要编写高效的代码,则应避免对部分结果进行多次中间复制,并避免进行非尾部递归调用(以限制调用堆栈的大小:
reverse(L) -> reverse(L,[]). % use an accumulator to create a tail recursive function
reverse([],R) -> R;
reverse([H|T],R) -> reverse(T,[H|R]). % all [H|R] can be fully evaluated before recursively calling reverse
% this is what is called a tail recursive function
% in addition, the construction of [H|T]
% does not require to make a copy of T
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1814 次 |
| 最近记录: |