家庭作业:子列表?检查项目是否是第一个项目的子列表

时间:2012-05-30 18:58:57

标签: scheme racket atomic sublist

所以我有这个程序需要使用具有以下属性的Racket在Scheme中编写,我很难过。该函数名为sublist?,其中两个输入SL都是列表。它会检查S是否为L的子列表,并返回#t#f

示例类似于:

sublist? of (A A) and (A B C) is #f
sublist? of (A B C) and (A B D A B C D) is #t
sublist? of (A (B)) and (C ((A (B))) (C)) is #t

需要创建一个名为extractLists的小函数来提取列表,(atomicSublist S L)用于检查两个提取的列表,以查看S的每个元素是否都在{{1} }}

到目前为止我已经

L

第二部分并没有真正做任何事情,甚至没有输出提取的S值。

更新了代码: 仅用于测试我现在使用(define (atomicSublist S L) (cond ((null? L) #f) ((equal? S (car L)) #t) (else (atomicSublist S (cdr L))))) 来检查。

3 个答案:

答案 0 :(得分:1)

从一个更简单的问题开始然后概括。

您如何编写一个检查符号'a是否为列表的函数?

答案 1 :(得分:0)

我认为您不希望这次检查((equal? S (car L) ) #t),因为L的车将永远不会等于列表S.

下面是我为atomicSublist提出的建议。

    (define (atomicSublist S L)
        (cond
            [(null? S) #t]
            [(member? (car S) L) (atomicSublist (cdr s) L)]
            [else #f]))

答案 2 :(得分:0)

这个问题有点含糊不清。这会带来什么回报? (子列表?'(a(b))'(a b c d e))??

无论如何这里是我写的:

(define (sublist? s l)  
  (cond ((null? s) true)
        ((atom? (car s))
         (cond ((exists? (car s) l) (sublist? (cdr s) (remove-elm (car s) l)))
               (else false)))
        (else 
         (cond ((sublist? (car s) l) (sublist? (cdr s) (remove-elm (car s) l)))
               (else false)))))


(define (exists? elm l)
  (cond ((null? l) false) 
        ((atom? (car l))
         (cond ((symbol=? elm (car l)) true)
               (else (exists? elm (cdr l)))))
        (else
         (cond ((exists? elm (car l)) true)
               (else (exists? elm (cdr l)))))))



(define (remove-elm elm l)
  (cond ((null? l) '())
        ((null? elm) l)
        ((atom? elm)
         (cond ((atom? (car l)) 
                (cond ((symbol=? elm (car l)) (cdr l))
                      (else (cons (car l) (remove-elm elm (cdr l))))))
               (else
                (cons (remove-elm elm (car l)) (remove-elm elm (cdr l))))))
        (else
         (remove-elm (cdr elm) (remove-elm (car elm) l)))))


(define (atom? elm)
  (and (not (null? elm)) (not (pair? elm))))

(子列表?'(a a)(' a b c d e))返回#f。 (子列表?'(a b c)'(a d b e c f))返回#t。 (子列表?'(a(b))'(c((a(b))e f)))返回#t。 (子列表?'(a(b)b)'(c((a(b))e f)))后退#f。但是,(子列表?'(a(b))'(a b c d))返回#t。