List “;mcar:需要类型为<;的参数;可变对>;;给定()”;类成员函数
我想知道如果我输入的元素不在列表中,会出现什么问题。在那里它显示了一个错误。List “;mcar:需要类型为<;的参数;可变对>;;给定()”;类成员函数,list,function,scheme,boolean,racket,List,Function,Scheme,Boolean,Racket,我想知道如果我输入的元素不在列表中,会出现什么问题。在那里它显示了一个错误。--mcar:需要类型为的参数;给定()当您到达列表末尾时会发生什么?类似于(1 2 3)的列表实际上是一个cons单元格链: (define fun3 (lambda (item list) (cond ((equal? item (car list))) ((fun3 item (cdr list))) (else #f)))) 使用汽车可以获得左侧的东西,使
--mcar:需要类型为的参数;给定()
当您到达列表末尾时会发生什么?类似于(1 2 3)
的列表实际上是一个cons单元格链:
(define fun3
(lambda (item list)
(cond ((equal? item (car list)))
((fun3 item (cdr list)))
(else #f))))
使用汽车
可以获得左侧的东西,使用cdr
可以获得右侧的东西。考虑在<代码>(1×2)< <代码> >代码中搜索“<代码> 4”/代码>时发生的情况:
(1 2 3) == (1 . (2 . (3 . ())))
最后,您将返回到这样的情况:项
是(仍然)4
,而列表
是(3)()
。现在,将调用(fun3项(cdr列表))
,然后项将(仍然)是4
,但列表将是()
。您不能调用(car())
,因为()
不是cons单元格。您需要明确检查list
是否为空列表:
(define fun3
(lambda (item list)
(cond ((equal? item (car list)))
((fun3 item (cdr list)))
(else #f))))
可以大大简化为返回!条件代码>。您看到您的代码与此类似吗?特别是,您的第二个案例是(fun3项(cdr列表))
。如果它是真的,那么你返回真的。如果它是假的,那么你转到下一个案例,然后…返回false。这意味着您可以简单地返回(fun3项(cdr列表))
的值
更重要的问题是,您说过要检查项
是否是列表或其任何子列表的元素,但您的代码现在(等待检查空列表的修复)只检查项
是否是列表
的成员,而不是其任何子列表。当项目
不等于(车辆列表)
时,可能是因为(车辆列表)
是另一个列表,您需要递归到to并检查项目
是否在其中。你可能会从中得到帮助,但它不会告诉你怎么做
如果您在racket中使用可变列表/对,您必须记住它是与常规列表完全不同的数据类型,在常规列表中使用()语法。
当您通过调用“请求”库处理可变数据时:
(请求方案/mpair)
现在,在构造对、谓词等时,您必须切换到使用该库中的相应过程-mcar、mcdr、mpair、mlist、mcons。否则,无法接收来自“mcons”的错误。
我输入(fun3'w(list'a'b))来执行此操作,但它会显示前面提到的错误。如果它找到了元素,那么就没有错误。另请参阅。非常感谢,伙计。是我的错。我会记住的。
(define fun3
(lambda (item list)
(cond ((null? list) <...>)
((equal? item (car list)))
((fun3 item (cdr list)))
(else #f))))
if ( condition ) {
return false;
}
else {
return true;
}