【问题标题】:How to split a list into two parts in Scheme如何在Scheme中将列表分成两部分
【发布时间】:2015-05-03 11:59:59
【问题描述】:

示例:(split '(1 2 3 4) '3)

答案应该是:((1 2 3) 4)

函数需要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)))))

【问题讨论】:

  • 嗨@Atif,欢迎来到 StackOverflow。您应该将代码缩进四个空格以将其格式化为代码,而不是使用“>”。
  • 不清楚这个函数应该做什么,请用文字解释一下——比如要求输出是两个列表还是一个列表和一个数字?
  • 它需要一个列表和一个数字,嵌套列表包含小于或等于该数字的所有值,更大的数字将在列表的右侧。
  • @Atif - 在你拨打(split '(1 2 3 4 5) 3)的情况下会发生什么?
  • @Inaimathi 应该是 ((1 2 3) 4 5)

标签: scheme racket


【解决方案1】:

一个简单的解决方案:

(define (split-list xs y) 
  (define (less x)    (<= x y))
  (define (greater x) (>  x y))
  (list (filter less xs)
        (filter greater 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)

【讨论】:

  • 如果我想要它没有辅助功能?
  • 然后你可以使用 (lambda ...)
【解决方案2】:

这是一种可能的解决方案,使用 Racket 中的内置程序:

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

例如:

(split '(1 2 3 4) 3)
=> '((1 2 3) 4)

(split '(1 2 3 4 5) 3)
=> '((1 2 3) 4 5)

【讨论】:

    【解决方案3】:

    这是使用名为 let 的您自己的版本。它会遍历数据,结果是相反的,因为它是最有效的。

    (define (binary-bucket-sort lst threshold)
      (let loop ((lst lst) (less-equal '()) (greater '()))    
        (cond ((null? lst) 
               (cons less-equal greater))
              ((<= (car lst) threshold) 
               (loop (cdr lst) (cons (car lst) less-equal) greater))
              (else 
               (loop (cdr lst) less-equal (cons (car lst) greater))))))
    
    (binary-bucket-sort '(1 5 9 2 6 10 3 7 9 8 4 0) 5) 
    ; ==> ((0 4 3 2 5 1) . (8 9 7 10 6 9))
    

    【讨论】:

      【解决方案4】:

      如果您对 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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-07-17
        • 2020-04-05
        • 2021-01-07
        • 1970-01-01
        • 2019-11-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多