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