【发布时间】:2011-07-01 16:07:43
【问题描述】:
我正在做以下 Erlang 练习:
写一个函数,给定一个列表 列表,将连接它们。示例:
concatenate([[1,2,3], [], [4,five]]) ⇒ [1,2,3,4,five].
我想出了这个:
concatenate([]) ->
[];
concatenate([[H]|Tail]) ->
[H|concatenate(Tail)];
concatenate([[]|Tail]) ->
concatenate(Tail);
concatenate([[H|T]|Tail]) ->
[H|concatenate([T|Tail])].
这行得通,但我注意到我正在做这个[T|Tail] 的事情。
第一个问题
这仍然被认为是直接递归吗?
在那之后,我摆脱了[T|Tail] 并使用了一个累加器(如下所示)。
第二个问题
现在第二个代码是否考虑尾递归?
book hints 使用辅助函数(第二个代码正在这样做),但它似乎很冗长。是因为我错过了什么吗?
concatenate([]) ->
[];
concatenate([[H]|Tail]) ->
[H|concatenate(Tail)];
concatenate([[]|Tail]) ->
concatenate(Tail);
concatenate([[H|T]|Tail]) ->
[H|concatenate(T,Tail)].
concatenate([],Tail) ->
concatenate(Tail);
concatenate([H],Tail) ->
[H|concatenate(Tail)];
concatenate([H|T],Tail) ->
[H|concatenate(T,Tail)].
【问题讨论】:
标签: list recursion functional-programming erlang tail-recursion