正则序和应用序
今天看了Berkeley的SICP的视频后,总算明白了正则序(normal order)和应用序(application order)的区别。
正则序就是将全部表达式展开,然后再代入参数的值。这是一种很自然的方法,存在的问题是需要的空间很大并且如果参数的计算与其他的环境相关,则会产生不一致的效果。如:(*(random 12) random(12)),则这个表达式不一定等于(square ‘(random 12))。
应用序则是先将参数计算出来,然后再代入表达式进行计算。这种方法的缺点我没看出来,书上说要证明代换是等价的比较难。
函数式编程可以方便地进行并行计算的原因可能就是所有的元素都是函数,这些函数的关系是一定的,计算顺序由他们的关系确定。因此一些“弱相关”代码段就可以从这种结构中很自然地提取出来。(--个人观点)
正则序和应用序的区别原文:
正则序:
Call proc with argument expressions
应用序:
- Compute argument values
- call proc with values(calculated above)
几种排序
插入排序在待排序元素为顺序时的高效使得Shell想出来了插入排序的改进版,就是先将距离远的元素进行插入排序,然后在逐渐缩小间隔距离,不断进行排序。如对一个长度为16的数组,先对距离为15的元素进行排序,再对距离为8的元素进行排序,再对距离为4的元素进行排序....,这种方法就是Shell Sort
MergeSort的数据结构可以用链表数组来表示,不同的链表其中元素的数量是不一样的,如第一个里面有1个元素,第二个则有2个元素,第三个有4个元素。。。
其他
要多动手,现在只是看视频,看资料,没什么效果,上个周看的视频的内容都忘光了。动手,看书要和视频同步,不能图块。