程序设计语言学习笔记

来源:互联网 发布:人脸变老软件电脑版 编辑:程序博客网 时间:2024/04/30 08:37

最近稀里糊涂地在Coursera上学Programming Language Part A,到今天实在是坚持不下去了,一方面英语很捉急(尼玛我一直以为自己的英文很好,我去),另一方面在牛客网看了别人面筋中的面试题后想死的心都有了,他妈的哪有时间学这个。。。。。(然后我uneroll了课程,打游戏去了。。。。。。其实都是赤裸裸的借口了),不多说,下面就谈一下学到的几点浅薄的知识:


不是学一门具体的语言(我最后也掉到里面去了,所以觉得没意思)而是”how any language “fits together” to make you more effective programming in any language”,用的是ML语言,Emacs编辑器。

  1. 表达式三部曲:

    • Syntax
    • Type-checking
    • Evaluation
  2. 对递归的考虑

    • 避免重复递归,比如爬楼梯,一次可以爬1层或2层,递归关系是f(n) = f(n-1)+f(n-2),那么f(n-1)和f(n-2)就很大重复了,会使递归复杂度以指数形式增长,在Java就可以考虑用数组保存已经递归好的n,再在函数最前端判断是否被递归过,是则直接return。或者直接用for循环来写。在ML中对应的概念就是let表达式
    • Tail Recursion:节省递归调用的使用空间,调用函数后直接返回,比如下面:
fun sum1 xs =case xs of[] => 0| i::xs' => i + sum1 xs'

以及Tail Recursion版:

fun sum2 xs =let fun f (xs,acc) =case xs of[] => acc| i::xs' => f(xs',i+acc)inf(xs,0)end
  1. ML中变量是immutable的,重复声明前面的变量会被Shadow,即有不同的environment ,值和函数与变量都是binding的关系,这也带来一个好处就是修改变量的值不用考虑对最前的影响(感觉我说的有的扯。。。)
  2. Syntactic Sugar的概念,原来在入门一门语言的时候都有它的身影

还有一些ML中特有的把函数当成变量传来传去,函数与定义的环境相关而不是调用等等比较奇葩的概念,因为没有坚持下去,所以不是太懂。。。。


又放弃一门Mooc,本来可以拿证书的。。。。。

0 0