scheme序对与表的进阶

    在上一篇博客中介绍了序对与表的内在关系,蜻蜓点水,只涉及了点皮毛。因为这两个概念的重要性,有必要再深入的理解,所以继续思考SICP中涉及这两个概念的地方。

已知表是由序对构造而成,同时表和序对都满足闭包特性。上一篇中已经给出了'((1 2) 3 4)是由(cons (list 1 2) (list 3 4))。那么(list (list 1 2) (list 3 4))是哪样呢?与(cons (list 1 2) (list 3 4))有哪样区别呢?

   

左图表示的是(list (list 1 2) (list 3 4)),右图表示的是(cons (list 1 2) (list 3 4))。所以当用cdr分别求上面两个值时,得出的结果分别是'((3 4))和'(3 4)。scheme语言的本身就是用list表示的,例如上面的语句(list 1 2)在解释器内部就是一个表,表的三个元素分别是list、1和2。对它们分别求值,数字1、2的值是数字本身,而scheme约定表括号内的第一个元素是操作符,操作对象就是后面其他的元素,在这里就是1和2。所以这个式子的求值结果就是有list操作符作用在1和2上,产生包含元素1和2的表,用'( 1 2 )表示。(list (list 1 2) (list 3 4))根据表的闭包特性,表操作符的操作对象可以是另一个表(此表的值也通过子表达(list x x)求值得到),这里就是将表'(1 2)和'(3 4)作为元素再生成表'((1 2) (3 4))。到这里看以看到“数据”和“代码”其实是一回事,看你从哪个角度去看,也进一步说明“递归”是程序的本质特性之一。

    用树结构来表示上述两个表,更加形象,尤其涉及到递归操作时。

   

每一个非叶子节点代表一个表,左图有三个表组成,右图两个表。


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值