Поиск подсписков в списке

Я новичок в реальной схеме, и я пытаюсь понять, как вернуть все подсписки, заданные аргументом списка (т.е. (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 ответа

Во-первых, я предполагаю, что это домашнее задание; Пожалуйста, поправьте меня, если я ошибаюсь.

Далее: мне кажется, что у вас есть одно существенное недопонимание проблемы: она просит вас вернуть два списка, а не распечатывать их.

Далее я собираюсь познакомить вас с рецептом дизайна программ. Ваш первый шаг - записать определение данных, с которыми вы работаете - я не совсем уверен, что это здесь, но это может быть что-то вроде этого:

;; 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: пожалуйста, прости меня за то, что я дал тебе много маленьких шагов, а не ответ; смысл всех этих шагов - дать вам возможность ловить рыбу для себя, а не просто ждать, пока другие люди будут ловить вас.

Если вы просто хотите отфильтровать все списки в данном списке, используйте 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)))))
Другие вопросы по тегам