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