如何在Scheme中将列表拆分为两部分

如何在Scheme中将列表拆分为两部分,scheme,racket,Scheme,Racket,示例:(拆分(1234)'3) 答案应该是:((1234) 该函数需要1个列表和1个数字,输出应该是嵌套列表 嵌套列表由“mylist”的所有元素组成,这些元素等于或小于“num”,较大的数字应位于列表右侧 我试过了,但只有一个列表: (define (split mylist num) (cond ((null? mylist)'()) ((list? (car mylist))(split(car mylist) num)) ((> (car mylist)

示例:
(拆分(1234)'3)

答案应该是:
((1234)

该函数需要1个列表和1个数字,输出应该是嵌套列表 嵌套列表由“mylist”的所有元素组成,这些元素等于或小于“num”,较大的数字应位于列表右侧

我试过了,但只有一个列表:

(define (split mylist num)
  (cond
    ((null? mylist)'())
    ((list? (car mylist))(split(car mylist) num))
    ((> (car mylist) num)(split(cdr mylist) num))
    (else(cons (car mylist) (split(cdr mylist) num)))))
一个简单的解决方案:

(define (split-list xs y) 
  (define (less x)    (<= x y))
  (define (greater x) (>  x y))
  (list (filter less xs)
        (filter greater xs)))
(定义(拆分列表xs-y)
(定义(减去x)(x y))
(列表(无过滤器的X)
(筛选更大的xs)))
另一种选择:

(define (split-list xs y) 
  (define (less x) (<= x y))
  (define-values (as bs) (partition less xs))
  (list as bs))

(split-list '(1 2 3 4) 3)
(定义(拆分列表xs-y)

(定义(减去x)(这里有一个可能的解决方案,使用Racket中的内置程序:

(define (split mylist num)
  (cons
   (takef mylist (lambda (n) (<= n num)))
   (dropf mylist (lambda (n) (<= n num)))))

这是使用名为
的let
滚动您自己的版本。它使一次通过数据,结果是相反的顺序,因为它是最有效的

(定义(二进制桶排序lst阈值)
(let循环((lst-lst)(小于等于’())(大于’())
(条件((空?lst)
(缺点少等于多)

(如果您对Racket中的一些更具功能性的结构感到满意,例如
curry
等,您可以使用这种相当紧凑的方法:

(define (split-list xs y) 
  (call-with-values (thunk (partition (curry >= y) xs)) cons))

> (split-list '(1 2 3 4 5 6 7) 3)
'((1 2 3) 4 5 6 7)

您好@Atif,欢迎使用StackOverflow。您应该将代码缩进四个空格以将其格式化为代码,而不是使用“>”。不清楚该函数应该做什么,请用文字解释它-例如,输出要求是两个列表或一个列表和一个数字?它需要一个列表和一个数字,嵌套列表具有小于或等于该数字的所有值。较大的数字将出现在列表的右侧。@Atif-在您调用
(split'(12345)3)
?@Inaimathi的情况应该是((12345),如果我希望它没有帮助函数,那么您可以使用(lambda…)
(define (split-list xs y) 
  (call-with-values (thunk (partition (curry >= y) xs)) cons))

> (split-list '(1 2 3 4 5 6 7) 3)
'((1 2 3) 4 5 6 7)