gpt4 book ai didi

lisp - 对小于 n 的正数求和

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

(defun sum (n) 
(if (n<0) 0 n-1) ;; if n<0, add 0. Else add the next smallest.
(sum (n-1)))

到目前为止,我得出了类似的结果,但我不确定如何声明一个变量来存储我想要返回的总和。

最佳答案

请注意,您正在实现 1+2+...+m对于 m = n-1,它有一个简单的公式:

(lambda (n)
;; You could inject n-1 on the formula to get n.(n-1)/2
;; (like in Vatine's answer), but here I just decrement
;; the input to show how to modify the local variable
;; and reuse the formula linked above to sum up-to m.
(decf n)
(if (minusp n)
0
(/ (* n (1+ n)) 2)))

迭代版本也可以,在做简单循环时不需要递归:

(lambda (n) (loop :for x :below n :sum x))

关于您的代码:

  • 空间很重要1:n<0被读取为名称“N<0”的符号(默认大写)。 n-1也是如此这是一个名为“N-1”的符号。

  • (n<0)将尝试运行名为 n<0 的函数. (n-1)也是如此.

  • 比较:您可以使用 (minusp n) (< n 0) .
  • 递减:可以使用 (1- n) (- n 1) .

如果你写的是正确的,像这样:

(defun sum (n) 
(if (< n 0) 0 (- n 1))
(sum (- n 1)))

...仍然会有问题:

  • 您期待您的 (n-1)实际减少 n但这里是if只计算一个值而不产生副作用。

  • 您无条件调用(sum (n-1)) ,这意味着:无限递归。前面的 if 返回的值总是被忽略。


1:有关详细信息,请查看组成终止 字符:2.1.4 Character Syntax Types

关于lisp - 对小于 n 的正数求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35288042/

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