You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:不使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 04:55:24