一点背景知识
注意:别慌!我们通篇只会涉及到下面这一点点数学。如果想直接看重点,本小节可被安全跳过。
如果你不了解,所谓“递推(recurrence)关系”是指这样一个序列,其中的每个值都由先前的一个或多个值决定,并最终由一个或多个初始值完全决定。举例来说,Fibonacci数列可被定义为如下关系:
即,序列的前两个数分别为0和1,而第3个则为 ,第4个为 ,依此类推。
由于这列值可以永远持续下去,定义一个fibonacci
的求值函数略显困难。显然,返回一整列值并不实际。我们真正需要的,应是某种具有怠惰求值性质的东西——只在必要的时候才进行运算求值。
在Rust中,这样的需求表明,是Iterator
派上用场的时候了。实现迭代器并不十分困难,但比较繁琐:你得自定义一个类型,弄明白该在其中存储什么,然后为它实现Iterator
trait。
其实,递推关系足够简单;几乎所有的递推关系都可被抽象出来,变成一小段由宏驱动的代码生成机制。
好了,说得已经足够多了,让我们开始干活吧。
当前内容版权归 DaseinPhaos 或其关联方所有,如需对内容或内容相关联开源项目进行关注与资助,请访问 DaseinPhaos .