重学前端六---状态机

153 阅读3分钟

一、有限状态机

  • 每一个状态都是一个机器
    • 在每一个机器里,我们可以做计算、存储、输出......
    • 所有的这些机器接受的输入是一致的
    • 状态机的每一个机器本身没有状态,如果我们用函数来表示的话,它应
  • 该是纯函数(无副作用) • 每一个机器知道下一个状态
    • 每个机器都有确定的下一个状态(Moore)
    • 每个机器根据输入决定下一个状态(Mealy)
//每个函数是一个状态
function state(input) //函数参数就是输入
{
//在函数中,可以自由地编写代码,处理每个状态的逻辑
return next;//返回值作为下一个状态
}
/////////以下是调用//////////
while(input) {
//获取输入
state = state(input); //把状态机的返回值作为下一个状态
}

二、不使用状态机处理字符串

  • 在一个字符串中,找到字符”a”


// 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
}
  • 在一个字符串中,找到字符”ab”


// 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'));
  • 在一个字符串中,找到字符”abcdef”

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'));
  • 在一个字符串中,找到字符”abcabx”

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'));
  • 在一个字符串中,找到字符”abababx”

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'));