我正面临car
和cdr
功能
例如:
首先我定义了一个名为x
的列表(define x (a (bc) d ( (ef) g ) ))
所以x现在等于(a (bc) d ( (ef) g ) )
现在举例来说,我需要仅使用car
和cdr
从此列表中获取 g
(!! noshortcuts as caddr cddr !!)正确的答案是:
(car(cdr(car(cdr(cdr(cdr x))))))
但是怎么样? :-(我按照规则工作(car
给出了列表的头部,cdr
给出了尾部)
而不是得到上面的答案我一直得到错误的答案。 任何人都可以帮助我理解这一点......给我一步或一步一步解决它
提前致谢。我真的厌倦了Scheme。
答案 0 :(得分:39)
尝试一步一步地做:
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
答案 1 :(得分:4)
一次进行一次变换。 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
答案 2 :(得分:2)
这是获取列表值的简单/紧凑方式。
(cadr (cadddr x))
通过组合重复功能,您可以获得优雅易读的声明。
答案 3 :(得分:1)
(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
答案 4 :(得分:0)
您是否尝试过使用csi之类的REPL(read-eval-print-loop)?通过这种方式,您可以以交互方式处理此问题,这将使您更容易使用Scheme学习和解决此(和其他)问题。
答案 5 :(得分:0)
迭代地做。此外,意识到该计划总是倒退。
(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
希望有所帮助