我有以下代码,但是当我运行这个例子时:
(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))))))))
答案 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)