Scheme 如果在另一个列表中找到一个列表?

Scheme 如果在另一个列表中找到一个列表?,scheme,racket,Scheme,Racket,我开始学习球拍,但我不知道如何检查是否在另一个列表中找到了一个列表。类似于成员x list 1 2 3 x 4 5,但我希望x是一个数字序列 我知道如何实现递归,但我想知道它是否存在更直接的运算符 例如,我想知道列表3 4 5是否在列表1 2 3 4 5 6中找到,我想看看这个是-a吗?v type->boolean似乎就是您要寻找的东西,只需在循环时使用它即可捕获给定类型的任何结果并对其执行任何操作 您可能还想研究一下子类?如果您希望一次捕获所有列表类型,请从同一链接中选择c cls->boo

我开始学习球拍,但我不知道如何检查是否在另一个列表中找到了一个列表。类似于成员x list 1 2 3 x 4 5,但我希望x是一个数字序列

我知道如何实现递归,但我想知道它是否存在更直接的运算符


例如,我想知道列表3 4 5是否在列表1 2 3 4 5 6中找到,我想看看这个是-a吗?v type->boolean似乎就是您要寻找的东西,只需在循环时使用它即可捕获给定类型的任何结果并对其执行任何操作

您可能还想研究一下子类?如果您希望一次捕获所有列表类型,请从同一链接中选择c cls->boolean


如果有可能在一个列表中有一个列表,它已经在一个列表1,2,3,4,5,6中了,恐怕递归可能是最好的解决方案,因为有无限多循环的可能性,所以每次在原始列表中找到一个新列表时,最好在列表上运行递归,这样,任何给定数量的子列表仍将直接从Racket文档处理:

成员v lst[是否相等?]→ 还是信用证清单?F v:任何/c 名单? 平等吗?:any/c any/c->any/c=相等

定位lst的第一个相等元素?给。如果存在这样的元素,则返回以该元素开头的lst的尾部。否则,结果为f

或者在您的情况下:

成员345名单1234567

其中x是'3 4 5或列表3 4 5或cons 3 4 5

如果在列表中找到x搜索列表,它将返回“3 4 5 6 7”,如果未找到,则返回false f

或者,您可以使用assoc检查您的x是否符合多个列表中的一个,或者:

助理x名单1 2名单3 4名单x 6

将返回:

'x 6

也有lambda结构,但我不会深入,因为我还不是很熟悉球拍。希望这有助于:


编辑:如果成员给您的结果与您期望的不同,请尝试改用memq

您希望在列表中搜索后续元素:

(define (subseq needle haystack)
  (let loop ((index 0)
             (cur-needle needle)
             (haystack haystack))
    (cond ((null? cur-needle) index)
          ((null? haystack) #f)
          ((and (equal? (car cur-needle) (car haystack))
                (loop index (cdr cur-needle) (cdr haystack)))) ; NB no consequence
          (else (loop (add1 index) needle (cdr haystack))))))

这将计算出指针元素第一次在干草堆中找到的索引,如果不是,则计算为f

还可以使用一些字符串函数连接列表并比较它们,需要递归:

(define (list-in-list l L)
  (define (fn ll)
    (string-join (map number->string ll))) ; Function to create a string out of list of numbers;  
  (define ss (fn l))                       ; Convert smaller list to string; 
  (let loop ((L L))                        ; Set up recursion and initial value; 
    (cond
      [(empty? L)    #f]                   ; If end of list reached, pattern is not present; 
      [(string-prefix? (fn L) ss) #t]      ; Compare if initial part of main list is same as test list;
      [else    (loop (rest L))])))         ; If not, loop with first item of list removed;
测试:

(list-in-list (list 3 4 5) (list 1 2 3 4 5 6 ))
输出:

#t
通过将两个数字列表转换为字符串并进行比较,可以使用检查模式是否为另一个字符串的子字符串,如下所示:

(define (member? x lst)
  (define (f lst)
    (foldr string-append "" (map number->string lst)))
  (if (regexp-match (f x) (f lst)) #t #f))
f将数字列表转换为字符串。regexp match检查f x是否是出现在f lst中的模式

比如说,

> (member? (list 3 4 5) (list 1 2 3 4 5 6 7))
#t

我想我理解这个想法,但它对我的球拍水平来说有点太高级了:谢谢你的回答我试过了会员的345列表1234567,但它不起作用。每次都是f,这就是我在这里发布的原因。这有点奇怪,它不起作用,我不明白为什么。感谢您的回复:EDIT:same result with memqmember不会在列表中查找后续元素,但其中一个元素相等?因此成员'3 4 5'1 2 3 4 5 6 7;=>f而成员'345'1334567;=>3 4 5 6 7. cons 3 4 5不起作用,因为它正好需要2个参数。