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

Unexplained behaviour when using tail recursion

我正在尝试从 Erlang 中的列表中提取偶数元素,但我不明白为什么不返回结果列表 returns length(list)

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


dorec(Acc,[])->Acc;
dorec(Acc,[X|Y]) when X rem 2==0 -> dorec([X|Acc],Y).


rec(X) when is_list(X)->dorec([],X);
rec(_)->"Invalid input".

用法

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]