gpt4 book ai didi

lisp - 不能用 do 循环在 lisp 中求和

转载 作者:太空宇宙 更新时间:2023-11-03 19:03:18 25 4
gpt4 key购买 nike

(defun suma (L)
(setq var 0)
(do
((i 0 (+ i 1)))
((= i (length L)))
(+ var (nth i L)))
var)

为什么总是返回0?

它不应该返回列表 L 的总和吗?

最佳答案

+不修改其参数,因此,由于您从未修改 var,因此返回其初始值 0。

您需要将 (+ var (nth i L)) 替换为 (incf var (nth i L)),等价于 (setq var (+ var (nth i L))).

参见 incf .

请注意,您应该将 varlet 绑定(bind)而不是使用 setq 使其成为全局性的.

最重要的是,请注意您的算法在列表参数的长度上是二次(因为nth 从头开始​​每次都会扫描您的列表)。

这里有一些更好的实现:

(defun sum-1 (l)
(reduce #'+ l))

(defun sum-2 (l)
(loop for x in l sum x))

(defun sum-3 (l)
(let ((sum 0))
(dolist (x l sum)
(incf sum x))))

这是一个糟糕的实现:

(defun sum-4 (l)
(apply #'+ l))

sum-4 的问题在于,如果提供的列表的长度大于 call-arguments-limit,它将失败。 .

关于lisp - 不能用 do 循环在 lisp 中求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41067087/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com