使用尾递归时无法解释的行为
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]
我正在尝试从 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]