编程时的状态驱动思想

状态驱动是编程时的一种很重要的算法思想,能够帮助我们梳理和解决很多的问题,可以说很多的计算机算法,做的事情都是将程序从一个状态转移成为另一个状态。

我们通过一个常见的例子来说明状态驱动的思想如何帮助我们梳理清楚思路的

题目如下:

三对狮子,三个大狮子分别是三个小狮子的妈妈,大狮子会吃别的狮子的孩子不吃自己的孩子。他们要过一条河,只有一条船,可以同时坐两头狮子。三个大狮子都会划船,三个小狮子中只有一只会划船。
问:六头狮子,怎样才能全部到达河对岸,而小狮子不能被吃掉??

在遇到上述题目的时候,如果我们经常刷一些算法题目的话,可能会这样思考这个问题:

通过DFS,从初始状态,分析每个状态可能变成的其他状态,分析这些状态是否合法(也就是没有小狮子会被吃掉),如果合法则继续递归,如果遇到了重复的情况,则直接复用之前递归出来的结果,如果遇到了环则不再继续往更深层递归。

这确实是一种思路,也确实看似涉及到了状态。

但是这种思路更像是状态搜索,即通过算法搜索出所有状态,直到找到最终状态。

而且这种状态搜索的方式只适用于计算机,也无法对我们进行系统的设计有所参考。

本文所说的状态驱动,思考方式是反其道而行之的,即,先通过排列组合列举出所有可能的情况,然后筛选出其中的合法状态,最后在能够通过一步进行状态转移的状态之间建立路径,最后如果能从初始状态到目的状态之间找到一条路径,那么就是问题的答案。

这种思考方式不仅可以用于解决算法问题,对于我们设计系统也有帮助。

比如我们需要设计一个匹配系统,匹配过程中可能有各种事件发生,事件之间有互斥发生的关系需要代码控制,这种设计思路下,我们考虑的是当一件事发生的时候,其他的事情是否可以发生,如果不可以,我们需要通过一个标志位去锁住,知道另一个时间发生时去解除锁。

每次新增一个事件,我们都要增加锁,并且要处理不同锁之间的关系,那么这个系统的复杂度会膨胀的非常厉害,而且很难说这个系统处于一个什么状态。

而如果我们采用状态驱动,先梳理出所有的状态,收到不同的事件时,进行合法的状态转移,这样不仅逻辑清晰,当增加新的事件时,只需要对应到它会引起的状态变化即可。