使用scheme'获得3个值的中值;s

使用scheme'获得3个值的中值;s,scheme,Scheme,这次的问题是要得到三个值的中值(简单) 我这样做: (define (med x y z) (car(cdr(x y z))) 它被接受了,但在测试时: (med 3 4 5) 我得到这个错误: 错误:尝试调用非过程 (2 3 4) 当输入字母而不是数字时,我得到: (md x y z) 错误:未定义变量 y (软件包用户) 使用x y z以外的东西,我得到: (md d l m) 错误:未定义变量 d (软件包用户) 问题被删除了,我也不知道该怎么做 编写一个返回3个值的中值的函数 很

这次的问题是要得到三个值的中值(简单)

我这样做:

(define (med x y z) (car(cdr(x y z)))
它被接受了,但在测试时:

(med 3 4 5)
我得到这个错误:

错误:尝试调用非过程
(2 3 4)

当输入字母而不是数字时,我得到:

(md x y z)
错误:未定义变量
y
(软件包用户)

使用x y z以外的东西,我得到:

(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))))
33>(定义(med x y z)
(如果(和(

(您可能希望创建一个列表,如下所示:

(define (med x y z) (car(cdr(list x y z)))
但是,将这些值捆绑到一个列表中只是为了再次撤消它们,这似乎是一种浪费。这将产生相同的效果:

(define (med x y z) y)

您可能希望创建一个列表,如下所示:

(define (med x y z) (car(cdr(list x y z)))
但是,将这些值捆绑到一个列表中只是为了再次撤消它们,这似乎是一种浪费。这将产生相同的效果:

(define (med x y z) y)

请注意,根据定义,
(med.rest)
等同于
(cadr rest)
(除了
med
只接受三个值)。就我个人而言,我希望一个应该返回值的中值的函数返回,不管列表顺序如何。例如,
(med 4 2 5)
将返回4和
(3 0 9 6 5)
将返回5

至于语法错误(这对于编写
med
,并不重要,因为有一种更好的方法使用
排序
长度
和),你没有把括号放在正确的位置。下面是另一种书写你现在所拥有的内容的方法,与他们的兄弟姐妹和他们祖先的右边对齐:

(if (and (
           (<x y) 
           (<y z) 
           y
           if
           (and (
                  (<y x) 
                  (<x z) 
                  x 
                  z
)   )    ) )    )
所有术语都是条件的子术语,没有
true expr
false expr
。您希望将代码编写为:

(if (and ...)
    y
    (if (...) ; we know that (not (and (< x y) (< y z))
        x
        z))
对于您的代码,它将是:

(cond ((and ...) y)
      ((...) x)
      (else z))
else
没有什么特别之处(它是一个语法结构而不是一个表达式,并不重要)。您可以使用任何计算结果为true的值(例如
#t


请记住,在Lisp中,括号同时围绕函数和参数(
(foo 1 2 3)
,而不是
foo(1,2,3)
),这与数学表示法中括号仅围绕参数不同。

请注意,根据定义,
(med.rest)
等同于
(cadr rest)
(除了
med
只接受三个值)。就我个人而言,我希望函数能够返回值的中值,不管列表顺序如何。例如,
(med 4 2 5)
将返回4,
(3 0 9 6 5)
将返回5

至于语法错误(这对于编写
med
,并不重要,因为有一种更好的方法使用
排序
长度
和),你没有把括号放在正确的位置。下面是另一种书写你现在所拥有的内容的方法,与他们的兄弟姐妹和他们祖先的右边对齐:

(if (and (
           (<x y) 
           (<y z) 
           y
           if
           (and (
                  (<y x) 
                  (<x z) 
                  x 
                  z
)   )    ) )    )
所有术语都是条件的子术语,没有
true expr
false expr
。您希望将代码编写为:

(if (and ...)
    y
    (if (...) ; we know that (not (and (< x y) (< y z))
        x
        z))
对于您的代码,它将是:

(cond ((and ...) y)
      ((...) x)
      (else z))
else
没有什么特别之处(它是一个语法结构而不是一个表达式,并不重要)。您可以使用任何计算结果为true的值(例如
#t


请记住,在Lisp中,括号同时围绕函数和参数(
(foo 1 2 3)
,而不是
foo(1,2,3)
),这与数学符号中括号仅围绕参数的情况不同。

虽然outis在解释这个问题方面做得很好,但还有一点你需要知道

(<x y) 

(虽然outis在解释这个问题上做得很好,但还有一点你需要知道

(<x y) 

(当我编辑它时,我从结尾处删除了“怎么了?”这个问题很明显吗?他收到了三条错误消息,不希望我删除了“怎么了?”从我编辑它的结尾开始;问题不是很明显吗?他收到了三条错误消息,不希望@outis是的,没错,我这样做,但我对IFs、ANDs和ORs感到迷茫…@kristian:试着先对列表排序。然后,这很容易。@outis我说了你说的话,我试着做了,但仍然有问题problems@kristian:您正在进行的项目是什么?
length
list ref
()也应该有用。要编写一个返回3个值的中值的函数,请稍后编写4个示例(中值12 17 14)我会得到14个,我们可以使用and,或者,如果@outis是的是的,我就是这样做的,但我对IFs、ANDs和ORs感到迷茫…@kristian:试着先对列表进行排序。然后,这很简单。@outis我说了你说的话,我试着做了,但仍然有problems@kristian:你在做什么项目?
length
list ref
()也应该有用。要编写一个返回3个值的中值的函数|因此,稍后当我编写4示例(中值12 17 14)时,我将得到14,我们可以使用and或if等函数