求助:不使用count函数实现Clojure列表元素计数功能
实现自定义列表计数函数(替代count)
你当前的代码存在几个关键问题:
- 在
defn内部用def重新定义参数n,直接把传入的列表覆盖成了0,完全丢失了输入数据 while的语法错误:Clojure里while的正确格式是(while 条件 表达式...),不需要写do,而且你的条件< x n里n已经被设为0,根本不会进入循环- 完全没有处理列表的逻辑,既没遍历元素,也没统计数量
下面给两种可用的实现方式:
方式1:基础递归实现
这是函数式编程里最直观的写法,通过递归遍历列表,每次去掉第一个元素、计数加1,直到列表为空时返回0:
(defn my-count [lst] (if (empty? lst) 0 (+ 1 (my-count (rest lst))))) (println (my-count '(1 4 8))) ; 输出3
方式2:loop/recur尾递归优化(适合长列表)
如果处理很长的列表,普通递归可能会触发栈溢出,用loop/recur做尾递归优化更安全:
(defn my-count [lst] (loop [remaining lst total 0] (if (empty? remaining) total (recur (rest remaining) (+ total 1))))) (println (my-count '(1 4 8))) ; 输出3
这个写法的逻辑是:
loop初始化两个变量:remaining存待遍历的剩余列表,total存当前统计的数量- 每次调用
recur时,把remaining更新为去掉第一个元素后的列表,total加1 - 当
remaining为空时,total就是最终的元素总数
内容的提问来源于stack exchange,提问作者user20166753
相关产品推荐
相关产品推荐

