Ракетка, обменивающая первый и третий элементы списка в функции? - PullRequest
0 голосов
/ 15 мая 2018

Предположим, у меня есть список (ы) в Ракетке:

`(1 2 3)

`(1 2 3 4)

`((1 2) (3) (4)))

Тогда, когда я обменяю его (первый и третий элемент), оно будет выглядеть так:

`(3 2 1)

`(3 2 1 4)

`((4) (3) (1 2))

Обратите внимание: для этого я могу использовать только такие вещи, как «против», «во-первых» и «отдых».

Вот моя текущая попытка:

(define new-list
(lambda(list)
  (first (rest (rest list))))) ; Get third element.

Я не могу повторить результаты выше. Я хотел бы показать, как это делается.

Ответы [ 3 ]

0 голосов
/ 15 мая 2018

Чтобы написать вашу процедуру, мы хотим взять список ввода xs и построить новый список, например

(cons (third-element xs)
      (cons (second-element xs)
            (cons (first-element xs)
                  (everything-except-the-first-three-elements xs)))

В ракетке у вас есть car и cdr, но у вас также естьcadr, caddr, cddddr и все, что находится между .

Чтобы получить для них интуицию, a читает голову, d читает хвост, поэтому

  • car получает голову (первый элемент в списке)
  • cdr получает хвост (все, кроме первого элемента в списке)
  • cadr получает голову хвоста (второй элемент в списке)
  • cddr получает хвост хвоста (все, кроме первого и второго элементов в списке)
  • caddr получает голову хвоста хвоста (третий элемент в списке)
  • и так далее ...

Мы можем легко написать это, используя наш car и cdr помощники

(define (swap xs)
  (cons (caddr xs)                  ; cons the third element ...
        (cons (cadr xs)             ; onto the second element ...
              (cons (car xs)        ; onto the first element ...
                    (cdddr xs)))))  ; onto the tail of the third element

(swap '(1 2 3))         ; '(3 2 1)
(swap '(1 2 3 4))       ; '(3 2 1 4)
(swap '((1 2) (3) (4))) ; '((4) (3) (1 2))
0 голосов
/ 20 мая 2018
(define nth 
  ;; Return nth element of list
  (lambda (lst n)
    (cond ((null? lst) 'nil)
          ((zero? n)   (car lst))
          (else (nth (cdr lst) (- n 1))))))

(define slice
  ;; Return lst sliced like python
  (lambda (lst a b acc)
    (cond ((null? lst) (reverse acc))
          ((< b a) (reverse acc))
          ((zero? b) (reverse acc))
          ((zero? a) (slice (cdr lst) 0 (- b 1) (cons (car lst) acc)))
          (else (slice (cdr lst) (- a 1) (- b 1) acc)))))

(define swap
  ;; Return nth and mth element swapped list
  (lambda (lst n m)
    `(,@(slice lst 0 n '()) 
      ,(nth lst m)
      ,@(slice lst (+ n 1)  m '())
      ,(nth lst n)
      ,@(slice lst (+ m 1) (length lst) '()))))

Это меняет местами любые две заданные позиции m и n и возвращает результирующий список.

(swap your-list 0 2) ; returns your-list 1st and 3rd elements swapped
0 голосов
/ 15 мая 2018

Просто поиграйте с этим немного:

> '(one)
'(one)
> '(one two three)
'(one two three)
> (first '(one two three four))
'one
> (rest '(one two three four))
'(two three four)
> (define foo (lambda (lst)
    (cons (first lst) (rest lst))))
> (foo '(one two three four))
'(one two three four)
> (define bar (lambda (lst)
    (cons (first (rest lst))
          (cons (first lst) (rest lst)))))
> (bar '(one two three four))
'(two one two three four)

Теперь у вас есть все для завершения процесса.

...