使用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等函数