Erlang获取第n个元素问题:如何在非目标位置删除列表头部
修正Erlang获取列表第N个元素的代码
原代码的问题出在递归调用时没有移除列表的头部元素,导致每次递归都在同一个列表上操作,最终无论N取何值(只要N≥1)都会返回列表的第一个元素。
修正后的代码
-module(lab02). -export([functionGetnth/2]). functionGetnth([], _N) -> {error, no_such_element}; functionGetnth([H|_T], 1) -> H; functionGetnth([_H|T], N) when N > 1 -> functionGetnth(T, N-1).
关键修正说明
第三个函数子句中,我们将递归调用的参数从[H|T]改为T——也就是去掉当前列表头部元素后的剩余列表,同时将N减1。这样每一次递归都会:
- 丢弃列表的当前头部元素(向目标位置靠近一步)
- 把目标位置序号减1
当N最终减到1时,返回当前列表的头部元素,也就是原列表的第N个元素。
示例验证
调用functionGetnth([a, b, c, d], 3)时:
- 第一次递归:传入列表
[b, c, d],N=2 - 第二次递归:传入列表
[c, d],N=1 - 触发第二个子句,返回
c,符合预期
内容的提问来源于stack exchange,提问作者Andy891357
相关产品推荐
相关产品推荐

