计划中的汽车和司机让我发疯

时间:2010-04-30 20:44:38

标签: scheme

我正面临carcdr功能

的问题

例如:

首先我定义了一个名为x

的列表
(define x (a (bc) d ( (ef) g ) ))

所以x现在等于(a (bc) d ( (ef) g ) )

现在举例来说,我需要仅使用carcdr从此列表中获取 g (!! noshortcuts as caddr cddr !!)正确的答案是:

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

但是怎么样? :-(我按照规则工作(car给出了列表的头部,cdr给出了尾部)

而不是得到上面的答案我一直得到错误的答案。 任何人都可以帮助我理解这一点......给我一步或一步一步解决它

提前致谢。我真的厌倦了Scheme。

6 个答案:

答案 0 :(得分:39)

尝试一步一步地做:

  • 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
    

答案 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

希望有所帮助