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

Привет я сталкиваюсь с проблемой с 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 дает хвост),

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

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

15
задан Bill the Lizard 30 April 2010 в 20:51
поделиться

6 ответов

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

  • 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)))))) равно g 
     
40
ответ дан 1 December 2019 в 00:26
поделиться

сделать это итеративно. Также помните, что схема всегда смотрит назад.

(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
ответ дан 1 December 2019 в 00:26
поделиться
(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
1
ответ дан 1 December 2019 в 00:26
поделиться

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

(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
5
ответ дан 1 December 2019 в 00:26
поделиться

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

(cadr (cadddr x))

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

2
ответ дан 1 December 2019 в 00:26
поделиться

Пробовали ли вы использовать REPL (цикл чтения-оценки-печати), например csi ? Таким образом, вы можете работать над этим в интерактивном режиме, что упростит вам изучение и решение этой (и других) проблем с использованием Scheme.

0
ответ дан 1 December 2019 в 00:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: