方案中的列表返回范围

时间:2011-05-19 15:08:17

标签: list scheme

in scheme,

list-ref只返回一个元素。

但我想做

(my-list-operation 0 4'(1 2 3 4 5 6 7 8 9 10 11 12))

=> '(1 2 3 4)

有人可以告诉我该怎么做吗?

4 个答案:

答案 0 :(得分:3)

我相信在可用的情况下使用现有的质量库。因此,此答案使用SRFI 1(如果您使用的是Racket,请使用(require srfi/1)加载):

(define (list-range lst start end)
  (take (drop lst start) (- end start)))

示例:

(list-range (iota 12 1) 0 4)  ; => (1 2 3 4)

答案 1 :(得分:0)

(define get-n-items
    (lambda (lst num)
        (if (> num 0)
            (cons (car lst) (get-n-items (cdr lst) (- num 1)))
            '()))) ;'

(define slice
    (lambda (lst start count)
        (if (> start 1)
            (slice (cdr lst) (- start 1) count)
            (get-n-items lst count))))

get-n-items是一个帮助器,它将n个项目附加在一起。 slice获取一个列表,偏移量和计数并再次循环,直到找到起始索引 - 然后从那里返回n个项目。

(来自How do I take a slice of a list (A sublist) in scheme?

答案 2 :(得分:0)

(define my-list-operation
   (lambda (start end lst)
      (cond ((= 0 end) '())
            ((= 0 start) (cons (car lst) (my-list-operation 0 (- end 1) (cdr lst))))
            (else
               (my-list-operation (- start 1) (- end 1) (cdr lst))))))

应该这样做。

答案 3 :(得分:0)

更好的解决方案是:

(define (slice lst start [end #f])
  (let ([lst0 (drop lst start)])
    (take lst0 (or end (length lst0)))))

由于这将通过以下测试:

 (require rackunit)
 (test-case "slice list"
  (check-equal? (slice '(1 2 3 4) 1 1) '(2))
  (check-equal? (slice '(1 2 3 4) 0 1) '(1))
  (check-equal? (slice '(1 2 3 4) 0 2) '(1 2))
  (check-equal? (slice '(1 2 3 4) 0) '(1 2 3 4))
  (check-equal? (slice '(1 2 3 4) 1 2) '(2 3))
  (check-equal? (slice '(1 2 3 4) 1) '(2 3 4)))

Chris的解决方案并未涵盖所有这些情况。