Только с использованием минусов автомобиля CDR - PullRequest
2 голосов
/ 25 января 2011

Как получить элементы со 2-го по 7-й из списка, используя только следующие три функции:

  • cons
  • car
  • cdr

Пример;

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

Спасибо.

Ответы [ 2 ]

3 голосов
/ 25 января 2011
> (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)
0 голосов
/ 25 января 2011

Мое решение.Возможно, вы захотите инициализировать накопитель (acum) с 1 и / или использовать >= и <=.Вы не предоставили никакого вывода.

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