Scheme中列表的前5个元素

时间:2015-01-19 21:53:18

标签: list scheme racket

我想知道,如果给我一个如下列表:

 (list 3 6 9 2 1 0 5 9)

我想只生产前5个。但是:我想生产:

 (list 3 6 9 2 1)

我怎么能这样做呢。顺便说一下,不允许递归,语言为intermediate student。谢谢:))

3 个答案:

答案 0 :(得分:1)

实际上,像(1 2 3 4)这样的lis是一对(1 . (2 . (3 . (4 . ()))))。您不能重复使用对,因为您需要第5对指向()(null)而不是对链的其余部分。唯一的方法是在每个元素中使用相同的pair元素为每个元素创建一个新的car

(define (take lst cnt)
  (if (zero? cnt)               ; if you ask for zero element
      '()                       ; then return empty list
      (cons (car lst)           ; else make a pair with first element
            (take (cdr lst)     ; and result from take with the rest of the list
                  (- cnt 1))))) ; with one less element than you originally asked for

答案 1 :(得分:0)

如果内存服务,除了carcdr之外,计划提供caarcaaarcaaaar和等效重复的d s和各种组合和排列。所以一个解决方案是:

(define x (list 3 6 9 2 1 0 5 9))
(list (car x) (cadr x) (caddr x) (cadddr x) (car (cddddr x)))

(我确定这就是为什么要求你提供前五个;那里没有cdddddr - 教学点很可能是{{1}的允许重复} s和d s以及你可以使用的限制)

答案 2 :(得分:0)

我不知道你为什么要这样做,但避免递归的一种方法是展开循环:

(define (take1 xs) (cons (car xs) '()))
(define (take2 xs)
   (cons (car xs) (take1 (cdr xs))))
(define (take3 xs)
   (cons (car xs) (take2 (cdr xs))))
(define (take4 xs)
   (cons (car xs) (take3 (cdr xs))))
(define (take5 xs)
   (cons (car xs) (take4 (cdr xs))))