gpt4 book ai didi

list - 如何在 Lisp 中打印嵌套列表中的最大值和最小值

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

我正在尝试开发一个简单的函数来返回 Lisp 中的最小值和最大值。到目前为止,我已经有了适用于单个 Lisp 的基本解决方案,这里是代码

(defun get-smallest-large (lst &optional (smallest 0) (largest 0))
(setf smallest (first lst))
(setf largest 0)
(dolist (nxt lst)
(if (< nxt smallest)
(setf smallest nxt)
(if (> nxt largest)
(setf largest nxt))))
(cons smallest largest))

这就像:

(defun get-smallest-large '(1 2 -1 3))
= (-1 . 3)

现在,我一辈子都想不出如何改变这个解决方案来处理嵌套列表,例如,我输入了这个:

(defun get-smallest-large '(5 (-2 20 (3)) -6 (-7 13)))
= (-7 . 20)

我该怎么做?

最佳答案

这是您可以采用的一种方法:当您递归到子列表时,处理返回值,就好像它们也是外部列表的元素一样。示例(在 Scheme 中,这是我的“母语”;需要 SRFI 26 ):

(define (min-max x (min #f) (max #f))
(cond ((null? x) (if min (values min max) (values)))
((cons? x) (call-with-values (cut min-max (car x) min max)
(cut min-max (cdr x) <...>)))
(else (values (if (and min (< min x)) min x)
(if (and max (> max x)) max x)))))

这里有一个直接 Common Lisp 翻译,我的意思是它根本不是惯用的 CL,而是为不熟悉 Scheme 的 CL 程序员提供的,以了解 Scheme 代码的作用.特别是,Scheme 对正确尾递归的要求仍然成立,即使 CL 没有提供。

(defun min-max (x &optional min max)
(cond ((null x) (if min (values min max) (values)))
((consp x)
(multiple-value-call #'min-max (cdr x) (min-max (car x) min max)))
(t (values (if (and min (< min x)) min x)
(if (and max (> max x)) max x)))))

关于list - 如何在 Lisp 中打印嵌套列表中的最大值和最小值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19992698/

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