машина и cdr в схеме сводят меня с ума - PullRequest
14 голосов
/ 01 мая 2010

Привет У меня возникла проблема с функциями car и cdr

например:

сначала я определил список с именем x

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

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

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

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

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

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

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

Ответы [ 6 ]

39 голосов
/ 01 мая 2010

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

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

                                  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
    
4 голосов
/ 01 мая 2010

делайте преобразования по одному. 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
2 голосов
/ 04 мая 2010

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

(cadr (cadddr x))

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

1 голос
/ 01 мая 2010
(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
0 голосов
/ 01 мая 2010

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

(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

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

0 голосов
/ 01 мая 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...