求 Fibonacci 数列的 N 种算法
高中学过一个神奇的数列——Fibonacci 数列,它的特点是:除了最初的两个 Fibonacci 数以外,其余的所有 Fibonacci 数都等于前两个 Fibonacci 数之和。表达成数学公式就是:
下面是 Fibonacci 数列的头几项(0 是第零项)。
同时,Fibonacci 数列也出现在很多计算机相关的书上面,那么我们怎么编程求第 n 个 Fibonacci 数呢?1
高中学过一个神奇的数列——Fibonacci 数列,它的特点是:除了最初的两个 Fibonacci 数以外,其余的所有 Fibonacci 数都等于前两个 Fibonacci 数之和。表达成数学公式就是:
下面是 Fibonacci 数列的头几项(0 是第零项)。
同时,Fibonacci 数列也出现在很多计算机相关的书上面,那么我们怎么编程求第 n 个 Fibonacci 数呢?1
当你开始接触函数式的时候,经常能看到 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 的特性进行说明。如果曾经了解过函数式语言,本文可以作为语法简介来读。如果从未接触过函数式,那么你需要熟悉至少一门语言,并辅以适量的习题才可能入门。
最近 clone gist 的时候总是 timeout,Google 了一番,在 ssh 上找了半天原因后发现是因为 GFW 把 Gist 给墙了。
在很多语言中,我们都能看到函数式范型、动态类型、类型系统的身影,而 Erlang 在此基础上发展出了一些自成一派的特点:
Pid ! Message.
,收消息也就多个匹配和处理的过程:receive Message -> handle(Message) end.
。Erlang 的以上特性让它特别适合于实现高可靠、高性能的服务器。然而 Erlang 并不是一门新手友好的语言,且不说它属于函数式范型,光是它那受 Prolog 影响颇深的语法,也让人望而生畏。所以本文虽是快速入门,但也需要读者有一定的功力,熟悉至少一门静态类型语言和动态类型语言。否则,强行修炼,必将走火入魔。本文中涉及到的源代码可以在 Gist 获取。
本文所介绍的内容大部分是 Pro Git 2nd Edition 第二、三章中出现的常用命令,如果你有时间,建议将此书看一遍。
我们在进行网络编程时,绝大部分情况都会涉及到 IP 协议,因此了解一下 IP 协议是很有必要的。不过由于 IP 协议本身不算简单,而我们更多的是使用 TCP/UDP 等上层协议进行网络编程,因此要必要了解一下 IP 地址。
本文将介绍以下内容:
但是不介绍: