gpt4 book ai didi

recursion - 为什么这个 lisp 函数返回 nil?

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

我正在尝试构建一个 lisp 函数,它将 car 和 cdr 通过一个列表,同时将该列表中的值与最大值进行比较。如果列表中的值大于最大值,则该值被最大值替换。我想知道为什么我得到零的返回值?我是 lisp 的新手,我有 Java 背景,所以它对我来说很不一样。我不允许使用任何面向对象的东西,我仅限于 car、cdr、append、cons。我想返回列表“elements2”。

(defun enforce-upper-limit(maxVal elements elements2)
(when elements
(cond ((greaterThanMax (car elements) maxVal)(enforce-upper-limit maxVal (cdr lst) (append (maxVal))))
(t (enforce-upper-limit maxVal (cdr elements)(append (car elements)))))
)

)

最佳答案

格式和命名

Common Lisp 不区分大小写,因此您的 maxValgreaterThanMax将变得不可读。用 - 分隔名称的各个部分并将所有内容设为小写。

空格:左括号前面应该有一个空格。

缩进:这个有各种各样的规则,但长话短说:Lisp 模式下的 Emacs 将在 <Tab> 上做正确的事情。

最后,不要让行太长,80个字符的常规规则几乎是通用的。

整理后如下图:

(defun enforce-upper-limit (max-val elements elements2)
(when elements
(cond ((greater-than-max (car elements) max-val)
(enforce-upper-limit max-val (cdr lst) (append (max-val))))
(t (enforce-upper-limit max-val (cdr elements)
(append (car elements))))))

代码中的问题

一些明显的问题:

  1. 第 4 行:表达式 (max-val)将调用一个名为 max-val 的函数没有争论。我怀疑这是你想要的。

  2. 函数 append附加列表。在这两种使用情况下,它既没有给定要追加的列表,也没有要追加的列表。

  3. 函数 enforce-upper-limit充其量会返回nil .

  4. 什么是 lst ?可能应该是elements .

让我们开始修复吧。首先我们来处理问题3。当elementsnil ,答案应该累积在elements2中.此外,整个条件表达式类似于 if... elseif ...图案。所以,让我们尝试将它安排在一个 cond 中:

(defun enforce-upper-limit (max-val elements elements2)
(cond ((null elements) elements2)
((greater-than-max (car elements) max-val)
(enforce-upper-limit max-val (cdr lst) (append (max-val))))
(t (enforce-upper-limit max-val (cdr elements)
(append (car elements)))))

接下来,让我们看看我们真正想要实现的目标。第二个条款指出,如果 (car elements)太大了,max-val应该去 elements2 .如果(car elements) OK(最后一个子句),它被添加到elements2 .

向列表中添加一项是 cons 的工作, 不是 append .在这两种情况下,我们都同意 elements2所以表达式应该像(cons something elements2) .此外,替换 lstelements产生(几乎)正确的程序:

   (defun enforce-upper-limit (max-val elements elements2)
(cond ((null elements) elements2)
((greater-than-max (car elements) max-val)
(enforce-upper-limit max-val
(cdr elements)
(cons max-val elements2)))
(t (enforce-upper-limit max-val (cdr elements)
(cons (car elements) elements2)))))

其他问题

  • 不确定greater-than-max是否需要很简单 >就足够了。

  • elements2 中的项目与 elements 相比顺序错误(我把它留给你来解决)。这是列表迭代算法的常见问题。

最后,更多的 CL 方法是

(defun enforce-upper-limit (list max-val)
(loop for x in list
if x > max-val
collect max-val
else
collect x))

但这可能不适合您的作业。

关于recursion - 为什么这个 lisp 函数返回 nil?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46149302/

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