0

我的实现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))))))

除了明显的冗长之外,我的代码还有什么问题?

4

4 回答 4

1

我会试试这个:

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

可能我们有不同的 Scheme 实现。

编辑:

使用修改后的else分支:

(define rtn-lst
  (lambda (lst)
    (cond 
      ((list? lst)
        (if (null? lst)
            empty
            (flatten-list lst)))
      (else 
        (list lst)))))
于 2011-02-24T12:40:04.657 回答
1

我会认为atom?是错误的。你想知道 是否lst是一个列表,所以使用list?. 可以在某些实现上或为某些实现atom?返回 false 。但我不确定。其余的都很好。vectorstring

于 2011-02-24T13:16:14.987 回答
0

像这样的东西怎么样:

(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)

这是做你想做的吗?

于 2015-01-27T09:58:48.440 回答
0

像这样的东西怎么样:

(define (flatten x y)
    (if (null? x)
        y
        (if (list? (car x))
            (flatten (append (car x) (cdr x)) y)
            (flatten (cdr x) (append y (list (car x)))))))
(define (flat x)     
    (flatten x '()))

> (flat '(1(2(3(4(5)6)7)8)9))
(1 2 3 4 5 6 7 8 9)

和关闭版本:

(define (flatten x)  
        (define (flatten x y)
            (if (null? x)
                y
                (if (list? (car x))
                    (flatten (append (car x) (cdr x)) y)
                    (flatten (cdr x) (append y (list (car x)))))))
        (flatten x '()))

> (flatten '(1(2(3(4(5)6)7)8)9))
(1 2 3 4 5 6 7 8 9)
于 2020-02-03T18:36:18.193 回答