Поиск подсписков в списке - PullRequest
2 голосов
/ 09 января 2012

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

4 голосов
/ 09 января 2012

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

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

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

;; 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 голос
/ 12 января 2012

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