【发布时间】:2011-01-25 00:47:05
【问题描述】:
如何从列表中获取第 2 到第 7 的元素,只使用以下三个函数:
conscarcdr
示例;
> (two-to-seven (list 8 9 5 1 0 3 6 2 4))
> (9 5 1 0 3 6)
谢谢。
【问题讨论】:
-
你能举个输出的例子吗?
标签: list functional-programming scheme
如何从列表中获取第 2 到第 7 的元素,只使用以下三个函数:
conscarcdr示例;
> (two-to-seven (list 8 9 5 1 0 3 6 2 4))
> (9 5 1 0 3 6)
谢谢。
【问题讨论】:
标签: list functional-programming scheme
> (define (t2s xs)
(cons (car (cdr xs)) (cons (car (cdr (cdr xs))) (cons (car (cdr (cdr (cdr xs)))) (cons (car (cdr (cdr (cdr (cdr xs))))) (cons (car (cdr (cdr (cdr (cdr (cdr xs)))))) (cons (car (cdr (cdr (cdr (cdr (cdr (cdr xs))))))) (list))))))))
> (t2s (list 8 2 5 4 0 3 6 1 1))
(2 5 4 0 3 6)
【讨论】:
cons、car 和cdr”的要求。 :-P
'() 代替(list)。它们是相同的。
我的解决方案。您可能想用 1 初始化累加器 (acum),和/或使用>= 和<=。你没有提供任何输出。
(define (test-get start stop tlst)
(define acum 0)
(define (get-elems lst)
(cond ((null? lst) empty)
((and (symbol? (car lst))
(< acum stop)
(> acum start))
(set! acum (+ 1 acum))
(cons (car lst) (get-elems (cdr lst))))
((symbol? (car lst))
(set! acum (+ 1 acum))
(get-elems (cdr lst)))
(else (append (get-elems (car lst)) (get-elems (cdr lst))))))
(get-elems tlst))
样本输出
> (test-get 0 3 '(a (b) (c (d)) e (((f))) (h (i (j))) (k l)))
(b c)
> (test-get 2 6 '(a (b) (c (d)) e (((f))) (h (i (j))) (k l)))
(d e f)
> (test-get 2 7 '(a (b) (c (d)) e (((f))) (h (i (j))) (k l)))
(d e f h)
如果您对那里显示的append 感到困扰,您可以使用cons、cdr、car 将其替换为您自己的
(define (my-append l1 l2)
(if (null? l1)
l2
(cons (car l1) (my-append (cdr l1) l2))))
还要摆脱set!,这样我们就可以更深入地进行函数式编程(未经测试):
(define (test-get start stop tlst)
(define (liniarize lst)
(cond ((null? lst) empty)
((symbol? (car lst)) (cons (car lst) (liniarize (cdr lst))))
(else (my-append (liniarize (car lst)) (liniarize (cdr lst))))))
(define (take-elems lst acum)
(cond ((null? lst) empty)
((and (< acum stop)
(> acum start)) (cons (car lst) (take-elems (cdr lst) (+ 1 acum))))
(else (take-elems lst (+ 1 acum)))))
(take-elems (liniarize tlst) 0))
【讨论】: