Как удалить окружающие скобки во вложенном списке в схеме, если этот вложенный список содержит 1 элемент? - PullRequest
6 голосов
/ 15 октября 2011

Скажите, у меня есть список: (a b ((c)) (d + e) ((e + f)) (g) () h)

Как получить следующий список (желательно с функцией): (a b c (d + e) (e + f) g h)

Другими словами:

  • Если во вложенном списке есть только один элемент, он упрощается до элемента. То есть ((c)) упрощается до c в приведенном выше примере. Также ((e + f)) становится (e + f).

  • Если во вложенном списке более одного элемента, он остается прежним. То есть (d + e) остается как (d + e) в приведенном выше примере.

  • Если вложенный список нулевой, он просто удаляется.

Наконец Я не уверен, применяется ли термин flatten в этом случае. Я надеюсь, что мой вопрос ясен. Если нет, пожалуйста, дайте мне знать.

Заранее спасибо!

Ответы [ 2 ]

5 голосов
/ 15 октября 2011

Попробуйте использовать этот код:

(define (atom? x)
  (and (not (pair? x)) (not (null? x))))

(define (strip lst)
  (if (or (null? lst) (atom? lst) (not (null? (cdr lst))))
      lst
      (strip (car lst))))

(define (flatten lst)
  (cond ((or (null? lst) (atom? lst))
         lst)
        ((null? (strip (car lst)))
         (flatten (cdr lst)))
        (else
         (cons (flatten (strip (car lst))) (flatten (cdr lst))))))

При тестировании на вашем примере он дает ожидаемый ответ:

> (flatten '(a b ((c)) (d + e) ((e + f)) (g) () h))
> (a b c (d + e) (e + f) g h)
0 голосов
/ 15 октября 2011

Идея состоит в том, что вам нужна рекурсивная функция, которая:

  1. Проверяет, является ли список пустым
  2. Проверяет, является ли первый элемент списком, если не consк функции, примененной к cdr списка
  3. В противном случае функция применяется как к car, так и к cdr и cons для получения результатов.

Вотнепроверенная попытка:

(define flatten
  (lambda lst
    (cond 
      ((null? lst) lst)
      ((atom? (car lst)) (cons (car lst) (flatten (cdr lst))))
      (else (cons (flatten (cons (car (car lst) (cdr (car ls))) 
                  (flatten (cdr lst)))))))

Где atom? - это функция, которая проверяет, является ли элемент в списке не списком.Вот как atom? определяется в Little Schemer :

(define atom?
  (lambda (x)
    (and (not (pair? x)) (not (null? x)))))

Я настоятельно рекомендую The Little Schemer, если у вас возникают проблемы с организацией логики рекурсивных функций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...