Автомобиль и cdr в Схеме сводят меня с ума

Hi Im сталкивается с проблемой с функциями car и cdr

например:

сначала я определил список, который называется x

(define x (a (bc) d ( (ef) g ) ))

поэтому x теперь равно (a (bc) d ( (ef) g ) )

теперь, например, мне нужно получить g из этого списка, используя только car и cdr (!! noshortcuts как caddr cddr!!) правильный ответ:

(car(cdr(car(cdr(cdr(cdr x))))))

НО как?:-( Я работаю по правилам (car дает заголовку списка и cdr дает хвост)

и вместо того, чтобы получить ответ выше, я продолжаю получать неправильные ответы. Может ли кто-нибудь помочь мне в понимании этого... дайте мне шаг или способ решить его шаг за шагом.

Спасибо заранее. Я действительно устал от Схемы.

Ответ 1

Попробуйте сделать это шаг за шагом:

  • cdr выводит список без первого элемента
  • автомобиль дает первый элемент списка

                                  x         is  (a (bc) d ( (ef) g ))
                             (cdr x)        is  (  (bc) d ( (ef) g ))
                        (cdr (cdr x))       is  (       d ( (ef) g ))
                   (cdr (cdr (cdr x)))      is  (         ( (ef) g ))
              (car (cdr (cdr (cdr x))))     is            ( (ef) g )
         (cdr (car (cdr (cdr (cdr x)))))    is            (      g )
    (car (cdr (car (cdr (cdr (cdr x))))))   is                   g
    

Ответ 2

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

(cdr (a (bc) d ( (ef) g ) )) -> ( (bc) d ( (ef) g ) )
(cdr ( (bc) d ( (ef) g ) ))  -> ( d ( (ef) g ) )
(cdr ( d ( (ef) g ) ))       -> ( ( (ef) g ) )
(car ( ( (ef) g ) ))         -> ( (ef) g )  <- pulls the first element out, which happens to be a list itself
(cdr ( (ef) g ))             -> (g)
(car (g))                    -> 'g

Ответ 3

Это простой/компактный способ получить значение списка.

(cadr (cadddr x))

объединяя повторяющиеся функции, вы получаете элегантное легко читаемое утверждение.

Ответ 4

(cdr x) = ((bc) d ( (ef) g ) )
(cdr(cdr x)) = (d ( (ef) g ) )
(cdr(cdr(cdr x))) = (( (ef) g ) )
(car(cdr(cdr(cdr x)))) = ( (ef) g )
(cdr(car(cdr(cdr(cdr x))))) = (g)
(car(cdr(car(cdr(cdr(cdr x)))))) = g

Ответ 5

Пробовали ли вы использовать REPL (цикл read-eval-print-loop), например csi? Таким образом, вы можете работать над этим в интерактивном режиме, что облегчит вам изучение и работу через эту (и другие) проблемы с помощью схемы.

Ответ 6

сделать это итеративно. Кроме того, поймите, что схема всегда выглядит обратным.

(cdr x) = ( (b c) ...)
(cdr (cdr (cdr x))) = (( (ef) g))
(car (cdr (cdr (cdr x)))) = ((ef) g)
(cdr (car (cdr (cdr (cdr x))))) = (g)
(car (cdr (car (cdr (cdr (cdr x)))))) = 'g

надеюсь, что поможет