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)
有人可以告诉我该怎么做吗?
答案 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个项目。
答案 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的解决方案并未涵盖所有这些情况。