方案中列表的返回范围

发布于 2024-11-08 23:20:17 字数 163 浏览 0 评论 0原文

在方案中,

list-ref 仅返回一个元素。

但我想做

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

=>; '(1 2 3 4)

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

in scheme,

list-ref returns only one element.

but I want to do like

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

=> '(1 2 3 4)

could somebody tell me how to do this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

高跟鞋的旋律 2024-11-15 23:20:17

我相信在可用的情况下使用现有的高质量库。因此,这个答案使用 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)

I believe in using existing quality libraries where available. So, this answer uses SRFI 1 (if you're using Racket, load it using (require srfi/1)):

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

Example:

(list-range (iota 12 1) 0 4)  ; => (1 2 3 4)
浮华 2024-11-15 23:20:17
(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 个项目。

(来自我该如何采取方案中列表(子列表)的一部分?

(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 is a helper, which appends n items together. slice takes a list, offset and count and again loops until it finds the start index--then returns n items from there.

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

心奴独伤 2024-11-15 23:20:17
(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))))))

应该可以做到这一点。

(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))))))

That should do it.

街角迷惘 2024-11-15 23:20:17

更好的解决方案是:

(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)))

克里斯的解决方案并未涵盖所有这些场景。

A better solution is:

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

Since that will pass the following tests:

 (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' solution doesn't cover all of these scenarios.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文