一、有限状态机
- 每一个状态都是一个机器
- 在每一个机器里,我们可以做计算、存储、输出......
- 所有的这些机器接受的输入是一致的
- 状态机的每一个机器本身没有状态,如果我们用函数来表示的话,它应
- 该是纯函数(无副作用) • 每一个机器知道下一个状态
- 每个机器都有确定的下一个状态(Moore)
- 每个机器根据输入决定下一个状态(Mealy)
//每个函数是一个状态
function state(input) //函数参数就是输入
{
//在函数中,可以自由地编写代码,处理每个状态的逻辑
return next;//返回值作为下一个状态
}
/////////以下是调用//////////
while(input) {
//获取输入
state = state(input); //把状态机的返回值作为下一个状态
}
二、不使用状态机处理字符串
// 1
function indexof(string) {
let result = string.indexOf('a')
return result !== -1
}
// 2
function forof(string) {
for(let c of string){
if(c == 'a'){
return true;
}
}
return false;
}
// 3
function reg(string) {
let reg = RegExp(/a/)
return reg.test(string)
}
// 4
function search(string) {
return string.search('a') !== -1
}
// 5
function match(string) {
let reg = RegExp(/a/)
return string.match(reg) !==null
}
// 1
function indexof(string) {
let result = string.indexOf('ab')
return result !== -1
}
console.log(indexof('123abc'));
// 2
function search(string) {
return string.search('ab') !== -1
}
console.log(search('12a3bc'));
// 3
function forof(string) {
let hasA = false
for(let c of string){
if(c == 'a'){
hasA = true;
}else if (hasA && c === 'b'){
return true;
}else {
hasA = false;
}
}
}
console.log(forof('1abcdefg'));
function findString(string,tar) {
if (string.length < tar.length || typeof string !=='string' || typeof tar !== 'string' || !tar) return false;
for (let i = 0; i < string.length - tar.length-1; i++) {
let newStr = string.slice(i, i + tar.length)
if (newStr === tar) return true;
}
return false;
}
console.log(findString('012abccdef222','')) //false
console.log(findString('012ab','abcdef')) //false
console.log(findString(1234567,'abcdef')) //false
console.log(findString('012abccdef222',1234)) //false
console.log(findString('012abccdef222','abcdef')) //false
console.log(findString('012abcdef222','abcdef')) // true
二、使用状态机处理字符串
function forof(string) {
let state = start
for(let c of string){
state = state(c)
}
return state == end
}
function start(c) {
if(c == 'a'){
return foundB;
}else{
return start;
}
}
function foundB(c) {
if(c == 'b'){
return foundC;
}else{
return start(c);
}
}
function foundC(c) {
if(c == 'c'){
return foundD;
}else{
return start(c);
}
}
function foundD(c) {
if(c == 'd'){
return foundE;
}else{
return start(c);
}
}
function foundE(c) {
if(c == 'e'){
return foundF;
}else{
return start(c);
}
}
function foundF(c) {
if(c == 'f'){
return end;
}else{
return start(c);
}
}
function end(c) {
return end
}
console.log(forof('123abaabcdefg'));
function forof(string) {
let state = start
for (let c of string) {
state = state(c)
}
return state == end;
}
// 开始找a
function start(c) {
if (c == 'a') {
return foundB;
} else {
return start;
}
}
// 开始找b
function foundB(c) {
if (c == 'b') {
return foundC;
} else {
return start(c);
}
}
// 开始找c
function foundC(c) {
if (c == 'c') {
return foundA2;
} else {
return start(c);
}
}
// 开始找a2
function foundA2(c) {
if (c == 'a') {
return foundB2;
} else {
return start(c);
}
}
// 开始找b
function foundB2(c) {
if (c == 'b') {
return foundEnd;
} else {
return start(c);
}
}
// 开始找x
function foundEnd(c) {
if (c == 'x') {
return end;
} else {
return foundC(c);
}
}
function end(c) {
return end;
}
console.log(forof('abcabcabcabcabx'));
function forof(string) {
let state = start
for (let c of string) {
state = state(c)
}
return state == end;
}
function start(c) {
if (c == 'a') {
return foundB;
} else {
return start;
}
}
function foundB(c) {
if (c == 'b') {
return foundA2;
} else {
return start(c);
}
}
function foundA2(c) {
if (c == 'a') {
return foundB2;
} else {
return start(c);
}
}
function foundB2(c) {
if (c == 'b') {
return foundA3;
} else {
return start(c);
}
}
function foundA3(c) {
if (c == 'a') {
return foundB3;
} else {
return start(c);
}
}
function foundB3(c) {
if (c == 'b') {
return foundEnd;
} else {
return start(c);
}
}
function foundEnd(c) {
if (c == 'x') {
return end;
} else {
return foundA3(c);
}
}
function end(c) {
return end;
}
console.log(forof('ababab1abababx'));