这次的问题是获得三个值的中位数(简单)
我这样做了:
(define (med x y z) (car(cdr(x y z)))
它被接受但是在测试时:
(med 3 4 5)
我收到此错误:
错误:尝试调用非程序
(2 3 4)
当输入字母而不是数字时,我得到:
(md x y z)
错误:未定义的变量
ÿ
(包用户)
使用x y之外的东西我得到:
(md d l m)
错误:未定义的变量
d
(包用户)
问题被删除了不知道怎么回事
编写一个返回3个值的中位数的函数
很抱歉编辑我得到的问题我应该首先按顺序放置值,而不仅仅是一个窗台车和cdr的东西,所以我这样做了
33> (define (med x y z)
(if(and(
(<x y) (<y z) y
if(and(
(<y x) (<x z) x z)))))
Warning: invalid expression
(if (and< (<x y) (<y z) y if (and ((<y x) (<x z) x z))))
但是你看到我得到了一个警告,那么什么是wronge?
答案 0 :(得分:5)
您可能想要创建一个列表,如下所示:
(define (med x y z) (car(cdr(list x y z)))
但是,将值捆绑到列表中只是为了再次撤消它们似乎是浪费。这会产生同样的效果:
(define (med x y z) y)
答案 1 :(得分:1)
请注意,根据定义,(med . rest)
相当于(cadr rest)
(除了med
只需要三个值)。就个人而言,无论列表顺序如何,我都期望一个函数可以返回值的中值返回,median。例如,(med 4 2 5)
将返回4,(3 0 9 6 5)
将返回5.
至于语法错误(对于编写med
这一点并不重要,因为有更好的方式使用sort
,length
和list-ref
),你没有把括号放在正确的位置。这是写下你现在所拥有的另一种方式,与他们的兄弟姐妹及其祖先的右边排列条款:
(if (and (
(<x y)
(<y z)
y
if
(and (
(<y x)
(<x z)
x
z
) ) ) ) )
if
的格式为:
(if test-expr true-expr false-expr)
您的所有字词都是条件的子字词,并且没有true-expr
或false-expr
。您希望将代码编写为:
(if (and ...)
y
(if (...) ; we know that (not (and (< x y) (< y z))
x
z))
请注意,您可能会熟练地简化以后的测试,因为您知道之前的测试是错误的。
你也可以使用cond
,它比嵌套的if
s序列更清晰:
(cond (test result)
(test result)
(test result)
... )
对于您的代码,它将是:
(cond ((and ...) y)
((...) x)
(else z))
else
没有什么特别之处(它是一个语法结构而不是表达式,而不是它很重要)。您可以使用任何评估为true的值(例如#t
)。
请记住,括号括起Lisp中的函数和参数((foo 1 2 3)
,而不是foo(1, 2 ,3)
),不像数学符号,括号中只包含参数。
答案 2 :(得分:0)
(<x y)
使用参数y调用名为&lt; x的函数。你需要确保在&lt;之间添加一个空格。和x一样:
(< x y)