zoukankan      html  css  js  c++  java
  • lisp构造表

    CONS 操作符

    我们刚刚学习了如何拆分一个表,现在学习如何合并一个表。 CONS 操作符就是做这件事情的。

    假设有一个列表 (1 2 3) ,我们做一下 CAR 操作:

    (car '(1 2 3))
    

    返回 1 。

    我们再做一下 CDR 操作:

    (cdr '(1 2 3))
    

    返回 (2 3) 。

    CONS 操作符的作用就是将拆开的表连起来。

    (cons 1 '(2 3))
    

    返回的将是原来的列表 (1 2 3) 。

    S 表达式

    cons 操作符的第二个参数要是一个列表,才能返回一个列表。否则:

    (cons 2 3)
    

    返回

    (2 . 3)
    

    这次中间有一个点。为什么呢?

    因为,表实际上是一个树(二叉树)。我们上面所用到的带括号的式子被称为 S表达式。而在S表达式中, 二叉树在表示为 (Left . Right) 。

    如果左支是一个表,则就会成为如下形式。

    ((List) . Right)

    如果右支是一个表,当然也可以表示为 (Left . (List)) ,但是此时我们一般把点省略掉,写成

    (Left List)

    你现在可能有些晕,用一段表达式表示就很清晰了,如下

    '(3 . (2 3))
    

    (3 2 3)

    CONS操作符的作用是将两棵树连接成一棵树。

    那么现在你能回答为什么CDR操作符会取出除第一个外的所有元素了吗,因为它的实质是取二叉树的右支。

    总之CONS操作符的作用是连接一个元素与一个表(顺序不可颠倒)。

    (cons 2 '(2 3))
    

    (2 2 3)

    如果要连接三个或以上的元素,要这样

    (cons 1 (cons 2 '(3)))
    

    (1 2 3)

    真正有点实质性的是这个式子

    (cons 1 (cons 2 (cons 3 nil))) ;;; (1 2 3)
     
    (cons 3 nil) ;;; (3)
    

    如果二叉树的右支是NIL,那么连NIL都省略掉。如

    '(3 . Nil) ;;; (3)
    

    一件有趣的事情是这样

    (cdr '(3)) ;;; NIL
    

    append 函数 

    append函数的作用是连接两个表。

    >(append '(3 3) '(4 4))
     
    (3 3 4 4)
    

    形象点说,它会把最外一层括号去掉,然后连接。比如

    >(append '((3)) '(4 4))
     
    ((3) 4 4)
    

    LIST 函数 

    LIST 函数的意义是将所有的参数放入一个表中并返回之。

    >(list 1 1 1 1)
     
    (1 1 1 1)
     
    >(list '(2 3) '(2) 1 2)
     
    ((2 3) (2) 1 2)

     转自:http://zh.wikibooks.org/wiki/Lisp_%E5%85%A5%E9%96%80/%E7%AC%AC%E4%B8%89%E7%AB%A0_%E6%A7%8B%E9%80%A0%E8%A1%A8

     关于dot notation的详细说明:

    http://c2.com/cgi/wiki?DottedPairNotation

  • 相关阅读:
    LeetCode Subsets II
    LeetCode Rotate Image
    LeetCode Palidrome Number
    LeetCode Generate Parentheses
    LeetCode Maximum Subarray
    LeetCode Set Matrix Zeroes
    LeetCode Remove Nth Node From End of List
    Linux Loop设备 使用
    Linux 文件系统大小调整
    LeetCode N-Queens II
  • 原文地址:https://www.cnblogs.com/youxin/p/3420108.html
Copyright © 2011-2022 走看看