我想知道,如果给我一个如下列表:
(list 3 6 9 2 1 0 5 9)
我想只生产前5个。但是:我想生产:
(list 3 6 9 2 1)
我怎么能这样做呢。顺便说一下,不允许递归,语言为intermediate student。谢谢:))
答案 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)
如果内存服务,除了car
和cdr
之外,计划提供caar
,caaar
,caaaar
和等效重复的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))))