0
(define fun3
  (lambda (item list) 
    (cond ((equal? item (car list))) 
          ((fun3 item (cdr list)))
          (else #f))))

如果我输入不在列表中的元素,我想知道出了什么问题。那里显示一个错误。--mcar: expects argument of type <mutable-pair>; given ()

4

2 回答 2

1

当您到达列表末尾时会发生什么?像这样的列表(1 2 3)实际上是一个缺点单元链:

(1 2 3) == (1 . (2 . (3 . ())))

你得到左边的东西.using car,右边的东西 using cdr。考虑使用代码搜索时会发生4什么(1 2 3)

(define fun3
  (lambda (item list) 
    (cond ((equal? item (car list))) 
          ((fun3 item (cdr list)))
          (else #f))))

最终你会递归到itemis (still)4listis的情况(3 . ())。现在,(fun3 item (cdr list))将被调用,然后item将(仍然)是4,但list将是()。你不能打电话(car ()),因为()不是一个缺点细胞。您需要明确检查list空列表的情况:

(define fun3
  (lambda (item list) 
    (cond ((null? list) <...>)
          ((equal? item (car list))) 
          ((fun3 item (cdr list)))
          (else #f))))

现在,有两点需要注意:

  1. 这可以大大简化。使用一些布尔逻辑,您甚至可以完全摆脱它cond(请参阅Scheme,搜索一个单词是否是列表的一部分以了解有关如何操作的一些想法)。这里的一般观点是你正在做一些类似于 C 代码的事情

    if ( condition ) {
      return false;
    }
    else {
      return true;
    }
    

    可以大大简化为return !condition;. 您看到您的代码与此相似吗?特别是,您的第二种情况是(fun3 item (cdr list)). 如果它是真的,那么你返回真。如果它是假的,那么你去下一个案例并......返回假。这意味着您可以简单地返回(fun3 item (cdr list)).

  2. 更重要的问题是您说您想检查是否item是列表的元素或其任何子列表,但是您现在的代码(等待有关检查空列表的修复)仅检查是否item是 的成员list,而不是它的任何子列表。当item不等于 时(car list),可能是因为(car list)是另一个列表,您需要递归到并检查是否item在其中。通过查看scheme 中的嵌套列表来查找 number可能会对您有所帮助,但它不会告诉您确切的操作方法。
于 2013-10-14T23:37:01.480 回答
0

如果您在球拍中使用可变列表/对,您必须记住它是与常规列表完全分开的数据类型,您使用 () 语法。当您通过调用“请求”库处理可变数据时:(请求方案/mpair)
您现在必须切换到使用该库中的相应过程 - mcar、mcdr、mpair、mlist、mcons 在构造对时、谓词、等等。否则没有办法从“mcons”接收和出错。 http://docs.racket-lang.org/reference/mpairs.html

于 2015-01-29T16:19:45.980 回答