Erlang 使用尾部递归时无法解释的行为

Erlang 使用尾部递归时无法解释的行为,erlang,tail-recursion,Erlang,Tail Recursion,我试图从Erlang中的列表中提取偶数元素,我不明白为什么它不返回结果列表,而是返回length(list) 用法 mymodule:rec([1,2,3]). results: 3 mymodule:rec([2,2]).->2 results:2 方法rec/1未实现您指定的逻辑。试试这个: -module(rec). -compile([debug_info]). -export([rec/1]). % empty input dorec(Acc,[]) -> Acc;

我试图从Erlang中的列表中提取偶数元素,我不明白为什么它不返回结果列表,而是返回
length(list)

用法

mymodule:rec([1,2,3]). 
results: 3

mymodule:rec([2,2]).->2
results:2

方法
rec/1
未实现您指定的逻辑。试试这个:

-module(rec).
-compile([debug_info]).
-export([rec/1]).

% empty input
dorec(Acc,[]) -> Acc;

% uneven head is collected
dorec(Acc,[X|Y]) when X rem 2/=0 -> dorec([X|Acc],Y);

% even head is dropped
dorec(Acc,[_|Y]) -> dorec(Acc,Y).


% helper
rec(X) when is_list(X) -> dorec([],X);
rec(_) -> "Invalid input".
使用和输出:

1> c(rec). 
{ok,rec}
2> rec:rec([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]).
[9,7,5,3,1]

我没有得到你展示的结果。我得到了
**异常错误:没有函数子句匹配rec:dorec([],[1,2,3])(rec.erl,第6行)
,这是正确的,因为您没有指定when-guard为false时的情况:
dorec(Acc,[\ux | Y])->dorec Acc(Acc,Y)
。所以基本上问题是,当元素不均匀时,我没有做任何事情,因此,在第一个非均匀元素中,它将与guard不匹配。我好奇的是:如果我已经在递归调用中收集了一个
[2,4,6]
列表,现在出现了一个非均匀元素;由于没有后卫比赛,所有结果都会被丢弃吗?偶数2、4、6我们永远不会收集。你认为这是在哪里发生的?对不起,我改变了最初的帖子。我想收集偶数元素。我的问题仍然存在:如果我想收集偶数元素,到目前为止我收集了[2,4,6](所有元素都与保护匹配),然后一个奇数元素出现,我没有办法处理它,我的部分结果会被丢弃吗?不会,它不会被丢弃。已收集的号码位于
Acc
中,它总是作为第一个参数传递给下一个调用。
1> c(rec). 
{ok,rec}
2> rec:rec([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]).
[9,7,5,3,1]