如何在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)