Привет я сталкиваюсь с проблемой с 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
дает хвост),
и вместо того, чтобы получить ответ выше я продолжаю достигать неправильных ответов. Может любой помогать мне в понимании, что это... дает мне шаг или способ решить его шаг за шагом
Заранее спасибо. Я действительно сыт Схемой по горло.
Попробуйте сделать это шаг за шагом:
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
сделать это итеративно. Также помните, что схема всегда смотрит назад.
(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
надеюсь, что это поможет
(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
выполняют преобразования по одному. 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
это простой / компактный способ получить значение списка.
(cadr (cadddr x))
Комбинируя повторяющиеся функции, вы получаете элегантный, легко читаемый оператор.
Пробовали ли вы использовать REPL (цикл чтения-оценки-печати), например csi ? Таким образом, вы можете работать над этим в интерактивном режиме, что упростит вам изучение и решение этой (и других) проблем с использованием Scheme.