Erlang尾部递归,用于查找输入列表的每个列表中的元素数

Erlang尾部递归,用于查找输入列表的每个列表中的元素数,erlang,Erlang,如何在Erlang中使用尾部递归来表示我有列表[[1]、[2]、[3]、[3,2]],并且我想输出列表[[1]、[1]、[1]、[2]],其中输出列表中的每个列表表示输入列表中每个列表的元素数 我是函数式编程的初学者 谢谢我想这是一些家庭作业或自学练习,通常最好使用库函数或本机erlang结构,如列表理解: List = [[1], [2], [3], [3,2]], Result = lists:map(fun(X) -> [length(X)] end, List), Result =

如何在Erlang中使用尾部递归来表示我有列表[[1]、[2]、[3]、[3,2]],并且我想输出列表[[1]、[1]、[1]、[2]],其中输出列表中的每个列表表示输入列表中每个列表的元素数

我是函数式编程的初学者


谢谢

我想这是一些家庭作业或自学练习,通常最好使用库函数或本机erlang结构,如列表理解:

List = [[1], [2], [3], [3,2]],
Result = lists:map(fun(X) -> [length(X)] end, List),
Result = [[length(X)] || X <- List],
只要列表不太大,这个解决方案就没那么糟糕。它不是尾部递归,因为在递归的每一步,除了最后一步,“局部”工作的结果需要与后续步骤的结果相结合

为了解决这个问题,一般的解决方案是添加一个新的参数,称为累加器,它将在每个步骤记录到目前为止的评估结果,最后一个步骤将返回最终的完整结果

lengths_tail_recursive([],Acc) -> lists:reverse(Acc); % stop condition
% the result needs to be reverse due to the way the accumulator is built at each step
lengths_tail_recursive([H|T],Acc) -> lengths_tail_recursive(T,[[length(H)]|Acc]).
不同之处在于,在每个递归步骤中,只需返回下一步的结果,无需修改。通常,此解决方案使用第二个函数,该函数的作用是隐藏对第二个参数的需要,并为第一次调用正确初始化该参数

lengths(L) -> lengths_tail_recursive(L,[]).

注意:尾部递归解决方案使用2个库函数:length/1和list:reverse/1。我邀请您以尾部递归的方式编写它们

显示您尝试过的代码。
lengths(L) -> lengths_tail_recursive(L,[]).