gpt4 book ai didi

common-lisp - 从循环中的输出创建一个列表

转载 作者:行者123 更新时间:2023-12-02 04:50:57 24 4
gpt4 key购买 nike

我们的任务是以这种方式打印出帕斯卡三角形中的值

(pascal 2)
(1 2 1)
(pascal 0)
(1)

我在网上的某处复制了二项式定理的代码,定义如下:

(defun choose(n k)
(labels ((prod-enum (s e)
(do ((i s (1+ i)) (r 1 (* i r))) ((> i e) r)))
(fact (n) (prod-enum 1 n)))
(/ (prod-enum (- (1+ n) k) n) (fact k))))

现在我正尝试在我的 pascal 函数中根据此处的值创建一个列表:

(defun pascal (start end) 
(do ((i start (+ i 1)))
((> i end) )
(print (choose end i) ))
)

如果我用 (pascal 0 2) 测试它,该函数会产生 1 2 1 NIL。如何消除 NIL 并创建列表?

最佳答案

注意:我明确没有提供 pascal 的实现,因为介绍性的“我们的任务是……”表明这是一项家庭作业。

不是在每次迭代中打印(choose end i)的结果,而是将(choose end i)产生的值收集到结果列表中,然后然后在循环结束时返回结果。通过将元素插入其中,然后使用 nreverse 将其反转以产生最终返回值,以相反顺序构造列表是一种常见的习惯用法。例如,您可以通过以下方式实现 range:

(defun range (start end &optional (delta 1) &aux (results '()))
(do ((i start (+ i delta)))
((>= i end) (nreverse results))
(push i results)))

或(编写一个主体中不需要任何代码的 do/do* 循环总是让人感到满足。)

(defun range (start end &optional (delta 1))
(do* ((results '() (list* i results))
(i start (+ i delta)))
((>= i end) (nreverse results))))

这样

(range 0 10 3)
;=> (0 3 6 9)

但是,由于帕斯卡三角形中的行是回文,您不需要将它们反转。实际上,由于行是回文,您甚至应该能够调整循环以仅生成列表返回的一半,例如,

(revappend results results)

当元素个数为偶数时,

(revappend results (rest results))

当有奇数时。

关于common-lisp - 从循环中的输出创建一个列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18862699/

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