【问题标题】:Only by using cons car cdr仅通过使用 cons car cdr
【发布时间】:2011-01-25 00:47:05
【问题描述】:

如何从列表中获取第 2 到第 7 的元素,只使用以下三个函数:

  • cons
  • car
  • cdr

示例;

> (two-to-seven (list 8 9 5 1 0 3 6 2 4))
> (9 5 1 0 3 6)

谢谢。

【问题讨论】:

  • 你能举个输出的例子吗?

标签: list functional-programming scheme


【解决方案1】:
> (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 (cadr xs) (cons (caddr xs) (cons (cadddr xs)) (cons (car (cddddr xs)) (cons (cadr (cddddr xs)) (cons (caddr (cdddddr) xs))空))))))有点短:P
  • @nvm:是的,有点短,但不再符合“仅conscarcdr”的要求。 :-P
  • @Chris Jester-Young:我并没有把它看得太清楚
  • @borku:您可以使用'() 代替(list)。它们是相同的。
  • @borku:可以,也可以考虑将此答案标记为解决方案
【解决方案2】:

我的解决方案。您可能想用 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 感到困扰,您可以使用conscdrcar 将其替换为您自己的

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

【讨论】:

  • 谢谢,但任务是仅通过使用 car、cons 和 cdr 来解决这个问题:)
猜你喜欢
  • 1970-01-01
  • 2010-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-23
  • 1970-01-01
相关资源
最近更新 更多