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

如何用map、apply、filter实现提取完全平方数的函数?

解决Lisp中筛选完全平方数的问题

嘿,别着急,咱们一步步来搞定这个问题!你说现在的函数返回的是非完全平方数,那核心问题就是把判断条件反过来,再用filter来筛选列表里符合要求的元素就行。

首先,我们得先明确:怎么判断一个数是完全平方数?

对于正整数n来说,我们可以先取它的整数平方根(用isqrt函数,它会返回不超过n平方根的最大整数),然后把这个整数平方,如果结果等于原来的n,那n就是完全平方数。比如:

  • 对于4,(isqrt 4)是2,2²=4,所以是完全平方数;
  • 对于5,(isqrt 5)是2,2²=4≠5,所以不是。

基于这个逻辑,我们可以先写一个判断单个数字是否为完全平方数的辅助函数:

(defun perfect-square-p (n)
  (let ((root (isqrt n)))
    (= (* root root) n)))

接下来,我们只需要用filter把列表中满足这个条件的元素筛选出来,就是我们要的perfect-squares函数:

(defun perfect-squares (lst)
  (filter #'perfect-square-p lst))

如果不想单独写辅助函数,也可以把判断逻辑内联成匿名函数:

(defun perfect-squares (lst)
  (filter (lambda (n)
            (let ((root (isqrt n)))
              (= (* root root) n)))
          lst))

验证一下示例

咱们测试你给的几个例子:

(perfect-squares `(1 2 3 4 5 6 7 8 9)) → (1 4 9)
(perfect-squares '(15 16 17 24 25 26 25)) → (16 25 25)
(perfect-squares '(2 3 5 6)) → ()

完全符合预期!

至于你之前的函数返回非完全平方数,大概率是在判断时加了not(比如(not (perfect-square-p n))),把这个否定去掉,就会筛选出我们想要的完全平方数啦。

内容的提问来源于stack exchange,提问作者Renato D' Oyague

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:27:02