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

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

有人对我有什么建议吗?

4

2 回答 2

4

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

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

接下来,我将引导您了解如何设计程序的设计秘诀。你的第一步是写下你正在使用的数据定义——我不太确定它在这里是什么,但它可能是这样的:

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

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

样板:请原谅我给你很多小步骤而不是答案;所有这些步骤的重点是使您能够为自己钓鱼,而不仅仅是等待别人为您钓鱼。

于 2012-01-09T19:26:29.497 回答
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)))))
于 2012-01-12T08:24:21.063 回答