2010-04-30 27 views
13

林喜面臨的一個問題與carcdr功能汽車和方案CDR被我逼瘋了

例如:

首先我定義了一個列表把它叫做X

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

所以x現在等於(a (bc) d ((ef) g))

現在例如我需要從這裏得到g列表只使用carcdr (!! noshortcuts as caddr cddr !!)正確答案是:

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

但是怎麼樣? :-(我根據規則無效(即car給出列表的頭部和cdr使尾部)

,而不是得到了答案上面我一直到達錯誤的答案和。 任何一個可以幫助我理解這一點。 ..給我臺階或解決它提前一步一步

感謝的一種方式。我真的病計劃。

+0

@(回答我的問題的所有偉大的人) 我明白你們寫了什麼,只是有一些問題 | (g))我應該用汽車擺脫外在的禁忌才能得到(g)?| – 2010-04-30 21:06:04

+1

總是讓我失望的是,基於LISP的語言之一是它們似乎共享的** INCREDIBLY **糟糕的命名方案 – 2010-04-30 21:15:56

+0

當你擁有(g)'時,你有一個列表,你需要一個原子。使用'汽車'獲取第一個元素。同樣,如果你有'((g))',你需要使用'car'兩次,先到達'(g)',然後到'g'。 – 2010-05-03 21:09:41

回答

35

儘量做到一步一步來:

  • CDR產生的列表,而第一個元素
  • 產生一個列表

    的第一要素
           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 
    
+0

@Curd ||所以在第五行我用車去除了外部圓括號(或列表)?如果是這樣,爲什麼我沒有去除第5行的第二個括號,在到達內部之前再次使用另一輛車,並使用cdr(我的意思是爲什麼我們將汽車推遲到第7行? – 2010-04-30 21:13:45

+0

第5行的汽車(例如'(car((ef )g))''會給你留下'(ef)',如果你想要得到g,你不能把它扔掉;; car不會刪除括號,它會返回下面的第一項list。如果列表只包含一個項目,那麼你得到該項目,不再在列表中。 – 2010-04-30 23:03:32

0

您是否嘗試過使用REPL(讀-EVAL-打印循環)等如csi?這樣你就可以交互式地工作,這將使你更容易學習和使用Scheme來解決這個(和其他)問題。

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

希望幫助

3

做變換一次一個。 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

這是簡單/緊湊的方式來獲取列表的值。

(cadr (cadddr x)) 

通過組合重複功能,您會得到優雅易讀的語句。

+0

OP沒有特別要求快捷方式 – Menasheh 2018-02-14 12:29:06