Схема: посоветовать по внедрению сглаживать - PullRequest
0 голосов
/ 24 февраля 2011

Моя реализация flatten выглядит так:

(define flatten
  (lambda (lst)
    (if (null? lst)
        lst
        (append
          (rtn-lst (car lst))
          (flatten (cdr lst))))))

(define rtn-lst
  (lambda (lst)
    (cond 
      ((null? lst) 
        empty)
      ((atom? lst)
        (list lst))
      (else 
        (flatten lst)))))

В то время как стандартная реализация:

(define (flatten lst)
  (cond 
    ((null? list)
      empty)
    ((list? (car lst))
      (append (flatten (car lst)) (flatten (cdr lst))))
    (else
      (cons (car lst) (flatten (cdr lst))))))

Кроме очевидной многословности, что еще не так с моим кодом?

Ответы [ 3 ]

1 голос
/ 24 февраля 2011

Я бы посчитал atom? неправильным.Вы хотите знать, является ли lst списком, поэтому используйте list?.atom? может возвращать false на vector или string для некоторых реализаций.Но я не знаю точно.Все остальное хорошо.

1 голос
/ 24 февраля 2011

Я бы попробовал это:

(define rtn-lst
  (lambda (lst)
    (cond 
      ((list? lst)
        (if (null? lst)
            empty
            (flatten-list lst)))
      ((atom? lst)
        (list lst))
      (else 
        (flatten-list lst)))))

Возможно, у нас есть разные реализации Схемы.

РЕДАКТИРОВАТЬ:

С измененным else филиал:

(define rtn-lst
  (lambda (lst)
    (cond 
      ((list? lst)
        (if (null? lst)
            empty
            (flatten-list lst)))
      (else 
        (list lst)))))
0 голосов
/ 27 января 2015

Примерно так:

(define foo
  (lambda (e)
    (cond ((pair? e) `(,@(foo (car e)) ,@(foo (cdr e))))
          ((null? e) '())
          (else (list e)))))

Где, например:

> (foo '(((2 3) (4 . 5) 8)))
(2 3 4 5 8)

Делает ли это то, что вы хотите?

...