2012-01-09 90 views
2

我是一个真正的计划新手,我试图找出如何返回列表参数给出的所有子列表(即(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))) 

我试图通过列表和输出任何东西这是一个列表,然后再次搜索进行搜索,否则只是递归搜索列表的其余部分。但是,我不确定如何在满足条件时直接跳到最后一行。

有没有人对我有任何建议?

+0

http://stackoverflow.com的重复/问题/ 8754534 /功能,和列表式的方案,球拍 – dyoo 2012-01-11 15:19:53

回答

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 

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

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

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)))))