1

私は次のコードを持っていますが、この例を実行すると:

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

3 に答える 3

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

これがあなたが探している解決策であるかどうかはわかりません。

于 2013-02-22T13:56:05.380 に答える
0

一部の Scheme インタープリター (Racket など) には、組み込みのpartitionプロシージャーがあります。あるいは、SRFI 1にも含まれています。利用可能な場合は、それを使用すると、コードが簡素化されます。

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

partition2 つの値を返します。最初の値は述語を満たす要素のリストであり、2 番目の値は述語を満たさない要素のリストです。を使用してそれらを簡単に組み合わせて、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)
于 2013-02-22T14:39:50.897 に答える
-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)
于 2013-02-22T14:10:29.957 に答える