我被困住了,我是这样做的,但是我觉得这是错误的。
(defun (find-min a b))
(cond
(> a b) (find-min b (read))
(< a b) (find-min a (read))
)
(display (find-min (read) (read)))
给定的代码格式错误。经常测试您的代码,检查至少语法正确是非常重要的。而不是孤立地编写代码,您应该要求环境解释器来解析代码并执行。您的反馈循环会更短,这将有助于正确编写代码。
例如,如果您启动解释程序(您提到clisp
),您将处于读取Eval打印循环(REPL)中,在其中编写Lisp表单,对这些表单进行评估以产生结果,然后将其打印出来。因此,只需编写代码,就可以对其进行解析和评估,从而可以快速通知您可能的错误。
因此,如果您在编写代码时就编写了代码,则会注意到解释器首先读取此内容:
(defun (find-min a b))
这是因为所有括号都是平衡的:Lisp阅读器(REPL中的R)将建立两个元素的列表,即defun
和列表(find-min a b)
。执行评估时(REPL中的E),列表将解释为Lisp形式,但这是格式错误的defun
。
DEFUN
需要一个函数名称,后跟一个变量绑定列表,然后是函数体。因此,您可以尝试编写例如:
DEFUN
上面定义了一个名为(defun find-min (a b)
0)
的函数,该函数接受两个参数find-min
和a
,并且始终求值为0(该函数的主体)。
您要写的是:
b
您(defun find-min (a b)
(cond ...))
表格也格式不正确:
COND
[COND
中的[[每个子句]应该是首先包含一个测试,然后是零个或多个表达式的list。它将是:
(cond
(> a b) (find-min b (read))
(< a b) (find-min a (read))
)
请注意,还有剩余的情况,即cond
,未解决。方法
但是总的来说,我不理解您的代码正在试图实现什么。由于所有输入都应使用
(cond ((> a b) ...) ((< a b) ...))
获得,因此无需接受参数(= a b)
和(read)
。整个过程可能是一个循环:
a
但是我想您不应该使用循环形式,因此您应该尝试编写一个具有相同功能的递归函数。您需要做的是将递归读取的当前最小值递归传递给函数,如下所示:
b
for min = nil then(min(让((值(读取)))