分区帮助计划

时间:2013-02-22 12:18:16

标签: scheme

我有以下代码,但是当我运行这个例子时:

(partition 12 '(4 9 18 6 19 10 18 11 5 5 7 2 4 19 1 9 10 18 12))

我得到了

((4 9 6 10 11 5 5 7 2 4 1 9 10 12) (18 19 18 19 18)) 

作为回报。

我想要它如下

((4 9 6 10 11 5 5 7 2 4 1 9 10 12) 18 19 18 19 18)

我该怎么做才能改变这个?谢谢你的支持

      (require (lib "trace.ss"))
        (define (partition pivot lon)
          (if (null? lon)
              '(()())
              (let ((split-of-rest (partition pivot (cdr lon))))
                (if (<= (car lon) pivot)
                    (list (cons (car lon) (car split-of-rest))
                          (cadr split-of-rest))
                    (list (car split-of-rest) (cons (car lon)
                                                    (car (cdr split-of-rest))))))))

3 个答案:

答案 0 :(得分:0)

这就是我解决它的方法:

(define (partition pivot lon)
  (define (partition pivot lon less more)
    (if (null? lon)
      (cons less more)
      (if (<= (car lon) pivot)
        (partition pivot (cdr lon) (append less (list (car lon))) more)
        (partition pivot (cdr lon) less (append more (list (car lon)))))))
  (partition pivot lon '() '()))

Dunno,如果这是你正在寻找的解决方案。

答案 1 :(得分:0)

在某些Scheme解释器(例如,Racket)中,有一个内置的partition过程。或者,它也包含在SRFI 1中。如果可以使用它,它将简化您的代码:

(define (my-partition val lst)
  (let-values (((low high) (partition (lambda (x) (<= x val)) lst)))
    (cons low high)))

partition返回两个值,第一个是满足谓词的元素列表,第二个是不满足谓词的元素列表。可以使用cons轻松组合它们,以获得所需格式的结果。

或者,我们可以使用call-with-values,如@leppie所建议的那样:

(define (my-partition val lst)
  (call-with-values
   (thunk (partition (lambda (x) (<= x val)) lst))
   cons))

无论哪种方式,结果都符合预期:

(my-partition 12 '(4 9 18 6 19 10 18 11 5 5 7 2 4 19 1 9 10 18 12))
=> '((4 9 6 10 11 5 5 7 2 4 1 9 10 12) 18 19 18 19 18)

答案 2 :(得分:-1)

我发现递归方法很难,这是一种更简单,迭代的方法:

(define (partition pivot lst)
  (let loop ((a '()) (b '()) (lst lst))
    (cond
      ((null? lst)          (cons (reverse a) (reverse b)))
      ((<= (car lst) pivot) (loop (cons (car lst) a) b (cdr lst)))
      (else                 (loop a (cons (car lst) b) (cdr lst))))))

(partition 12 '(4 9 18 6 19 10 18 11 5 5 7 2 4 19 1 9 10 18 12))
=> '((4 9 6 10 11 5 5 7 2 4 1 9 10 12) 18 19 18 19 18)