一点背景知识

注意:别慌!我们通篇只会涉及到下面这一点点数学。如果想直接看重点,本小节可被安全跳过。

如果你不了解,所谓“递推(recurrence)关系”是指这样一个序列,其中的每个值都由先前的一个或多个值决定,并最终由一个或多个初始值完全决定。举例来说,Fibonacci数列可被定义为如下关系:一点背景知识 - 图1

即,序列的前两个数分别为0和1,而第3个则为 一点背景知识 - 图2 ,第4个为 一点背景知识 - 图3 ,依此类推。

由于这列值可以永远持续下去,定义一个fibonacci的求值函数略显困难。显然,返回一整列值并不实际。我们真正需要的,应是某种具有怠惰求值性质的东西——只在必要的时候才进行运算求值。

在Rust中,这样的需求表明,是Iterator派上用场的时候了。实现迭代器并不十分困难,但比较繁琐:你得自定义一个类型,弄明白该在其中存储什么,然后为它实现Iterator trait。

其实,递推关系足够简单;几乎所有的递推关系都可被抽象出来,变成一小段由宏驱动的代码生成机制。

好了,说得已经足够多了,让我们开始干活吧。