高中学过一个神奇的数列——Fibonacci 数列,它的特点是:除了最初的两个 Fibonacci 数以外,其余的所有 Fibonacci 数都等于前两个 Fibonacci 数之和。表达成数学公式就是:

F_{n}=\begin{cases} 0 & n=0\\ 1 & n=1\\ F_{n-1}+F_{n-2} & n\geq 2 \end{cases}

下面是 Fibonacci 数列的头几项(0 是第零项)。

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233...

同时,Fibonacci 数列也出现在很多计算机相关的书上面,那么我们怎么编程求第 n 个 Fibonacci 数呢?1


量子加密号称「绝对安全」绝不是哗众取宠,为什么这样说呢?因为与传统加密算法不同,量子加密的原理基于物理定律,而不是特定数学问题的计算复杂性。因此,无论计算机的运算能力怎么增强,也丝毫不影响量子加密的安全性。本文以 BB84 协议来介绍量子加密,下文为了方便不对量子加密和 BB84 协议进行区分。


当你开始接触函数式的时候,经常能看到 Haskell 的身影。那么 Haskell 究竟具有什么特点,让众多程序员为之倾倒?百闻不如一见,看几个例子你就懂了:

1
2
3
4
5
6
7
8
9
-- 从 1 到负无穷的列表
[1, 0..]                                        
-- 斐波那契数列
fibs = 0 : 1 : zipWith (+) fibs (tail fibs)
-- 快速排序
quicksort [] = []  
quicksort (x:xs) = (quicksort $ filter (< x) xs) ++ [x] ++ (quicksort $ filter (> x) xs)
-- 将 `*2` 和 `+3` 分别作用于列表
[(*2), (+3)] <*> [1, 2, 3]  -- [2,4,6,4,5,6]

通过这几个例子,可以看出 Haskell 表达能力极强。这是因为 Haskell 是一门支持惰性求值模式匹配列表解析类型类类型推断强静态类型 && 纯函数式语言。

本文主要介绍 Haskell 的语法,并不会对函数式或 Haskell 的特性进行说明。如果曾经了解过函数式语言,本文可以作为语法简介来读。如果从未接触过函数式,那么你需要熟悉至少一门语言,并辅以适量的习题才可能入门。




在很多语言中,我们都能看到函数式范型动态类型类型系统的身影,而 Erlang 在此基础上发展出了一些自成一派的特点:

  • 轻量级进程。Erlang 的进程既不是操作系统层面的进程,也不是线程,而是由 Erlang 虚拟机进行管理调度的无状态的进程。建立一个进程的成本非常低,在博主机器上(2.4 GHz Intel Core i5,8 GB 1600 MHz DDR3)平均只需要 2~4 us,而建立 80 万个进程也只花费了几秒的时间,并且据官方说法,建立一个进程的内存占用不到 400 字。
  • 消息原语。Erlang 直接在语言层面支持进程间通讯,并且在内部对并发进行了同步处理,用户不需要再关心多进程并发会不会发生同步问题,大大降低了在进程间传递消息的难度。例如,一句话就能搞定发消息:Pid ! Message.,收消息也就多个匹配和处理的过程:receive Message -> handle(Message) end.
  • 快速失败。如果发生了运行时错误,发生错误的进程会立刻停止执行,并借由消息机制传递错误,使其他进程能够帮助处理错误,或者干脆重启发生错误的进程。
  • 代码热更新。如果是其它语言,当代码发生变动需要重新部署时,比如紧急修复了一个 bug,你需要停止正在运行的服务器,编译后再重新运行新程序。但是使用 Erlang,你不需要停机,不需要停机,只需要利用消息机制通知服务器,更换模块即可,Erlang 虚拟机会自动加载新模块,达到“热更新”。
  • 分布式。Erlang 为分布式集群的实现提供了相当易用的函数,在集群的不同节点间通信与进程间通信的实现大同小异。如果熟悉了 Erlang 的消息机制,那么使用 Erlang 实现简单的分布式集群的学习成本近乎于零。

Erlang 的以上特性让它特别适合于实现高可靠、高性能的服务器。然而 Erlang 并不是一门新手友好的语言,且不说它属于函数式范型,光是它那受 Prolog 影响颇深的语法,也让人望而生畏。所以本文虽是快速入门,但也需要读者有一定的功力,熟悉至少一门静态类型语言和动态类型语言。否则,强行修炼,必将走火入魔。本文中涉及到的源代码可以在 Gist 获取。




我们在进行网络编程时,绝大部分情况都会涉及到 IP 协议,因此了解一下 IP 协议是很有必要的。不过由于 IP 协议本身不算简单,而我们更多的是使用 TCP/UDP 等上层协议进行网络编程,因此要必要了解一下 IP 地址。


本文将介绍以下内容:

  • LaTeX 对空格、换行、注释的处理
  • LaTeX 命令的基本形式
  • 如何进一步学习 LaTeX

但是不介绍

  • 如何安装 LaTeX。如果你是 Mac 用户,那么可以参考这篇文章
  • 基本的排版
  • 常用的命令和环境