使用scheme得到3个值的中值

时间:2010-04-30 23:10:38

标签: scheme

这次的问题是获得三个值的中位数(简单)

我这样做了:

(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?

3 个答案:

答案 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这一点并不重要,因为有更好的方式使用sortlengthlist-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-exprfalse-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)

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

(<x y) 

使用参数y调用名为&lt; x的函数。你需要确保在&lt;之间添加一个空格。和x一样:

(< x y)