我对erlang完全陌生。作为学习语言的练习,我尝试sublist
使用尾递归而不使用reverse
. 这是我从该站点http://learnyousomeerlang.com/recursion获取的功能:
tail_sublist(L, N) -> reverse(tail_sublist(L, N, [])).
tail_sublist(_, 0, SubList) -> SubList;
tail_sublist([], _, SubList) -> SubList;
tail_sublist([H|T], N, SubList) when N > 0 ->
tail_sublist(T, N-1, [H|SubList]).
似乎reverse
在 erlang 中的使用非常频繁。
在 Mozart/Oz 中,使用未绑定的变量很容易创建这样的函数:
proc {Sublist Xs N R}
if N>0 then
case Xs
of nil then
R = nil
[] X|Xr then
Unbound
in
R = X|Unbound
{Sublist Xr N-1 Unbound}
end
else
R=nil
end
end
是否可以在 erlang 中创建类似的代码?如果不是,为什么?
编辑:
我想澄清一下这个问题。Oz 中的函数不使用任何辅助函数(没有附加、没有反向、没有任何外部或 BIF)。它也是使用尾递归构建的。
当我问是否可以在 erlang 中创建类似的东西时,我在问是否可以使用尾递归在 erlang 中实现一个函数或一组函数,并且只对初始列表进行一次迭代。
至此,看了你的评论和回答,我怀疑能不能做到,因为erlang好像不支持未绑定变量。似乎所有变量都需要赋值。