背景提要:星期三的时候,xw交给我一个点灯的任务:大意是一个玩意单击的时候如何如何,长按又如何如何,双击又如何如何,几种状态分别执行不同的操作。
首先我们得明确:我们对于这台微型电脑的一切控制都是通过按按钮来完成的,且同一时间内,按钮只有“被按下”和“不被按下”两个状态。别看咱们是想什么时候按就什么时候按,机器只要 1ms 进行一次按钮的检测就足矣。因此,我们外部的输入完全可以看作是一个长度为毫秒数的 01 串,机器根据这个 01 串来判断何时执行何操作。还有一点是要注意的:在一个特定的时刻,机器并不知道将来的输入而只知道此刻以及之前的输入。换言之:我们的算法必须是在线的。
离线算法(offline algorithms) 在执行算法前需要所有输入数据已知。
在线算法(online algorithms) 在执行算法前不需要所有输入数据已知。
当然有可能讲的不全,不过我在这里给出的是一个充分条件而非充要条件。
这就导致了一种情况:在机器第一次检测到按钮被按下时,我们无法做出论断:我们不知道这是一次双击还是长按还是单击,我们只能静观其变,见机行事。但是按钮被按下时,我们的机器接收到了新的信息,确凿要进入一种和无输入状态不同的新的状态。或许之后由这个新的状态进入更新的状态。等到信息足以确认这是哪一种按键方法时,我们进入最终的状态并作出相应的操作。
仔细观察上述过程之后,我们便得以很容易地抽象出这一过程的几种组成要素,而这也是 有限状态自动机(FSM finite state machine 或 FSA finite state automaton) 的一些概念:
- 状态(State):一个状态机至少要包含两个状态,一个状态机在一个时刻只处于唯一一个状态,其中有一个状态是起始状态。不同的状态代表不同的意义,机器在不同的状态可以执行不同的操作。
- 转移(Transition):从一个状态变换到另一个状态,机器根据当前状态和读取的输入变换到另一个状态。
说了这么多,来个题目:
有一台电脑和一个引脚,引脚连接着一个开关,开关被触碰时按下,松开后弹起,电脑可以接收开关的状态。要求实现一个生成器 returnState ,可以检测到一次按键、两次按键、三次按键、长按四种不同的情况。(若短按两次后第三次长按,按照两次操作考虑)