查找列表中的子列表

时间:2012-01-09 18:55:06

标签: recursion scheme racket sublist

我是一个真正的计划新手,我正在尝试找出如何返回列表参数给出的所有子列表(即(1 2(3 4 5)(6 7 8)9)应该返回两个清单(3 4 5)和(6 7 8))。

我知道我应该在列表的其余部分使用递归函数,但是我无法生成我想要的结果。这是我写的: -

(define (find-sublists list)
  (cond
   ((null? list) #t))
  (not
   (list? (first list)))
  (print (first list))
  (find-sublists (rest list)))

我正在尝试搜索列表并输出任何列表,然后再次搜索,否则只是递归搜索列表的其余部分。但是,当条件满足时,我不确定如何直接跳到最后一行。

有人对我有任何建议吗?

2 个答案:

答案 0 :(得分:4)

首先,我假设这是一个家庭作业;如果我错了,请纠正我。

下一篇:在我看来,你对这个问题有一个至关重要的误解:它要求你返回两个列表,而不是打印它们。

接下来,我将引导您进入How To Design Programs设计配方。你的第一步是写下你正在使用的数据定义 - 我不太确定它在这里是什么,但它可能是这样的:

;; a list-of-maybe-lists is either
;; - empty, or 
;; - (cons maybe-list list-of-maybe-lists)

;; a maybe-list is either
;; - a list, or
;; - something else

下一步是为您的程序写下合同和目的声明,然后写下一些测试用例。

Boilerplate:请原谅我给你许多小步骤而不是答案;所有这些步骤的目的是让你自己钓鱼,而不是等待其他人为你捕鱼。

答案 1 :(得分:1)

如果您只想过滤掉给定列表中的所有列表,请使用filter

(filter list? '(1 2 (3 4 5) (6 7 8) 9))

或者您自己实施:

(define (my-filter func lst)
  (cond ((null? lst) '())
        ((func (car lst))
         (cons (car lst) (my-filter func (cdr lst))))
        (else
         (my-filter func (cdr lst)))))