溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何使用Java模擬XN*2圖靈機(jī)

發(fā)布時(shí)間:2022-02-19 16:00:11 來(lái)源:億速云 閱讀:147 作者:iii 欄目:開(kāi)發(fā)技術(shù)

本文小編為大家詳細(xì)介紹“如何使用Java模擬XN*2圖靈機(jī)”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“如何使用Java模擬XN*2圖靈機(jī)”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來(lái)學(xué)習(xí)新知識(shí)吧。

題目描述:

對(duì)于XN*2圖靈機(jī)進(jìn)行模擬,任意給定的十進(jìn)制數(shù),轉(zhuǎn)換為收縮擴(kuò)展二進(jìn)制的編碼,再編程模擬此Turing機(jī)的運(yùn)行過(guò)程,要求輸出從開(kāi)始運(yùn)行起的每一步驟的結(jié)果。用C或C++或Java或Python語(yǔ)言實(shí)現(xiàn)程序解決問(wèn)題。

要求:1. 程序風(fēng)格良好(使用自定義注釋模板);

2. 提供友好的輸入輸出,并進(jìn)行輸入數(shù)據(jù)的正確性驗(yàn)證。

源代碼:

import java.util.*; 
/**
 * @description: 該類(lèi)模擬XN*2圖靈機(jī),對(duì)任意給定的十進(jìn)制數(shù),轉(zhuǎn)換為收縮擴(kuò)展二進(jìn)制的編碼,并可輸出運(yùn)行中每一步驟的結(jié)果
 */
public class TuringMachine {
 
    private int internalState; // 圖靈機(jī)的內(nèi)態(tài)
    private String binCode; // 二進(jìn)制編碼
    Function f = new Function(); // 需要用到的方法
    List<String> binCodeList = new ArrayList<>(); // 用來(lái)存放二進(jìn)制編碼
 
    static int r = 0; // 當(dāng)r為1時(shí)機(jī)器向右移動(dòng)一格
    static int s = 0; // 當(dāng)s為1時(shí)機(jī)器停止運(yùn)行
 
    TuringMachine() {
        internalState = 0;
        binCode = "0";
    }
 
    public int getInternalState() {
        return internalState;
    }
 
    public void setInternalState(int internalState) {
        this.internalState = internalState;
    }
 
    public String getBinCode() {
        return binCode;
    }
 
    public void setBinCode(String binCode) {
        this.binCode = binCode;
    }
 
    /**
     * @description: 模擬圖靈機(jī)的運(yùn)行過(guò)程
     * @param: [binCode 二進(jìn)制編碼]
     * @return: void
     */
    public void runProcess(String binCode) {
        binCodeList = f.toArrayList(binCode); // 將二進(jìn)制碼binCode轉(zhuǎn)換為ArrayList類(lèi)型存放在binCodeList中
        // for循環(huán)對(duì)binCodeList進(jìn)行遍歷,根據(jù)當(dāng)前內(nèi)態(tài)的值判斷該執(zhí)行哪條指令
        for (int i = 0; i < binCodeList.size(); i++) {
            r = 1;
            // 當(dāng)s==1時(shí)機(jī)器停止,跳出循環(huán)
            if (s == 1) {
                break;
            }
            switch (getInternalState()) {
                // 內(nèi)態(tài)為0時(shí)執(zhí)行指令1
                case 0:
                    instruction_1(binCodeList.get(i), i, binCodeList);
                    break;
                // 內(nèi)態(tài)為1時(shí)執(zhí)行指令2
                case 1:
                    instruction_2(binCodeList.get(i), i, binCodeList);
                    break;
                // 內(nèi)態(tài)為10時(shí)執(zhí)行指令3
                case 10:
                    instruction_3(binCodeList.get(i), i, binCodeList);
                    break;
                // 內(nèi)態(tài)為11時(shí)執(zhí)行指令4
                case 11:
                    instruction_4(binCodeList.get(i), i, binCodeList);
                    break;
                default:
                    break;
            }
        }
        System.out.println("XN*2圖靈機(jī)計(jì)算的最終結(jié)果為:");
        f.toDecNum(f.toString(binCodeList)); // 將binCodeList轉(zhuǎn)換為String類(lèi)型的二進(jìn)制編碼binCode,再轉(zhuǎn)換為int類(lèi)型的十進(jìn)制數(shù)decNum
    } 
    /**
     * @description: 根據(jù)指令對(duì)每一步驟結(jié)果進(jìn)行打印
     * 指令1: 0 0 -> 0 0 R
     * 0 1 -> 1 0 R
     * 指令2: 1 0 -> 0 1 R
     * 1 1 -> 10 0 R
     * 指令3: 10 0 -> 11 1 R
     * 指令4: 11 0 -> 0 1 STOP
     * @param: [input 輸入, i 循環(huán)的次數(shù)從0開(kāi)始, binCodeList 存放二進(jìn)制編碼binCode]
     * @return: void
     */
    private void instruction_1(String input, int i, List<String> binCodeList) {
        System.out.println("當(dāng)前的內(nèi)態(tài)為:" + getInternalState() + ",輸入為:" + input);
        if (input.equals("0")) {
            System.out.println("執(zhí)行此條指令后的內(nèi)態(tài)為:" + getInternalState() + ",輸入為:" + binCodeList.get(i) + ",右移");
            System.out.println("此步驟的結(jié)果為:");
            System.out.println(f.toString(binCodeList));
        }
        if (input.equals("1")) {
            setInternalState(1);
            binCodeList.set(i, "0");
            System.out.println("執(zhí)行此條指令后的內(nèi)態(tài)為:" + getInternalState() + ",輸入為:" + binCodeList.get(i) + ",右移");
            System.out.println("此步驟的結(jié)果為:");
            System.out.println(f.toString(binCodeList));
        }
        System.out.println();
    }
 
    private void instruction_2(String input, int i, List<String> binCodeList) {
        System.out.println("當(dāng)前的內(nèi)態(tài)為:" + getInternalState() + ",輸入為:" + input);
        if (input.equals("0")) {
            setInternalState(0);
            binCodeList.set(i, "1");
            System.out.println("執(zhí)行此條指令后的內(nèi)態(tài)為:" + getInternalState() + ",輸入為:" + binCodeList.get(i) + ",右移");
            System.out.println("此步驟的結(jié)果為:");
            System.out.println(f.toString(binCodeList));
        }
        if (input.equals("1")) {
            setInternalState(10);
            binCodeList.set(i, "0");
            System.out.println("執(zhí)行此條指令后的內(nèi)態(tài)為:" + getInternalState() + ",輸入為:" + binCodeList.get(i) + ",右移");
            System.out.println("此步驟的結(jié)果為:");
            System.out.println(f.toString(binCodeList));
        }
        System.out.println();
    }
 
    private void instruction_3(String input, int i, List<String> binCodeList) {
        System.out.println("當(dāng)前的內(nèi)態(tài)為:" + getInternalState() + ",輸入為:" + input);
        if (input.equals("0")) {
            setInternalState(11);
            binCodeList.set(i, "1");
            System.out.println("執(zhí)行此條指令后的內(nèi)態(tài)為:" + getInternalState() + ",輸入為:" + binCodeList.get(i) + ",右移");
            System.out.println("此步驟的結(jié)果為:");
            System.out.println(f.toString(binCodeList));
        }
        System.out.println();
    }
 
    private void instruction_4(String input, int i, List<String> binCodeList) {
        System.out.println("當(dāng)前的內(nèi)態(tài)為:" + getInternalState() + ",輸入為:" + input);
        if (input.equals("0")) {
            setInternalState(0);
            binCodeList.set(i, "1");
            System.out.println("執(zhí)行此條指令后的內(nèi)態(tài)為:" + getInternalState() + ",輸入為:" + binCodeList.get(i) + ",STOP");
            System.out.println("此步驟的結(jié)果為:");
            System.out.println(f.toString(binCodeList));
        }
        s = 1;
        System.out.println();
    }
 
    public static void main(String[] args) {
        TuringMachine tm = new TuringMachine(); // 創(chuàng)建TuringMachine的實(shí)例tm
        System.out.println("請(qǐng)輸入一個(gè)十進(jìn)制數(shù):");
        Scanner scanner = new Scanner(System.in);
        try {
            int decNum = scanner.nextInt();
            tm.setBinCode(tm.f.toBinCode(decNum)); // 將十進(jìn)制數(shù)轉(zhuǎn)換為二進(jìn)制編碼并賦值給binCode
            System.out.println();
            tm.runProcess(tm.getBinCode()); // 運(yùn)行圖靈機(jī)
        } catch (InputMismatchException ex) {
            System.out.println("輸入有誤!");
        }
    } 
}
 
/**
 * @description: 該類(lèi)具有圖靈機(jī)TuringMachine運(yùn)行過(guò)程中所需要的一些方法
 */
class Function {
 
    /**
     * @description: 將十進(jìn)制數(shù)轉(zhuǎn)換為二進(jìn)制編碼
     * @param: [decNum 十進(jìn)制數(shù)]
     * @return: java.lang.String
     */
    public String toBinCode(int decNum) {
        String binCode = "";
        String binNum = Integer.toBinaryString(decNum); // 十進(jìn)制數(shù)轉(zhuǎn)換為二進(jìn)制數(shù)
        binNum += ","; // 用,標(biāo)識(shí)此二進(jìn)制數(shù)到此已完整,后面的0都忽略不計(jì)
        System.out.println("這個(gè)數(shù)的二進(jìn)制表示為:" + binNum);
        // 利用for循環(huán)對(duì)二進(jìn)制數(shù)binNum中的字符進(jìn)行遍歷,根據(jù)其中的每個(gè)字符得出二進(jìn)制編碼binCode
        for (int i = 0; i < binNum.length(); i++) {
            // 0 -> 0
            if (binNum.charAt(i) == '0') {
                binCode += "0";
                // 1 -> 10
            } else if (binNum.charAt(i) == '1') {
                binCode += "10";
                // , -> 110
            } else if (binNum.charAt(i) == ',') {
                binCode += "110";
            }
        }
        binCode = "0" + binCode + "00";
        System.out.println("這個(gè)數(shù)的二進(jìn)制編碼為:" + binCode);
        return binCode;
    }
 
    /**
     * @description: 將二進(jìn)制編碼轉(zhuǎn)換為十進(jìn)制數(shù)
     * @param: [binCode 二進(jìn)制編碼]
     * @return: int
     */
    public int toDecNum(String binCode) {
        int decNum = 0;
        String binNum = "";
        // 先利用for循環(huán)對(duì)ArrayList類(lèi)型的binCode進(jìn)行遍歷,根據(jù)其中的每個(gè)元素得出二進(jìn)制編碼binCode
        for (int i = 0; i < binCode.length(); i++) {
            // 0 -> 0
            if (binCode.charAt(i) == '0') {
                binNum += "0";
            } else if (binCode.charAt(i) == '1') {
                // 10 -> 1
                if (binCode.charAt(i + 1) == '0') {
                    binNum += "1";
                    i++;
                    // 110 -> ,
                } else if (binCode.charAt(i + 1) == '1') {
                    binNum += ",";
                    break;
                }
            }
        }
        System.out.println("二進(jìn)制表示:" + binNum);
        decNum = Integer.parseInt(binNum.substring(0, binNum.length() - 1), 2); // 將二進(jìn)制編碼binCode轉(zhuǎn)化為十進(jìn)制數(shù)
        System.out.println("十進(jìn)制表示:" + decNum);
        return decNum;
    }
 
    /**
     * @description: 將二進(jìn)制編碼binCode存放到binCodeList中
     * @param: [binCode 二進(jìn)制編碼]
     * @return: java.util.List<java.lang.String>
     */
    public List<String> toArrayList(String binCode) {
        binCode = binCode.replaceAll("", " ").trim(); // 將binCode中的每個(gè)字符用空格分隔開(kāi),并去掉首尾的空格
        // 根據(jù)分隔符空格分隔出binCode中的每個(gè)字符存放到binCodeList中
        List<String> binCodeList = new ArrayList<>(Arrays.asList(binCode.split(" ")));
        return binCodeList;
    }
 
    /**
     * @description: 將binCodeList轉(zhuǎn)換為二進(jìn)制編碼binCode
     * @param: [binCodeList 存放binCode的容器]
     * @return: java.lang.String
     */
    public String toString(List<String> binCodeList) {
        String binCode = String.join("", binCodeList);
        return binCode;
    } 
}

讀到這里,這篇“如何使用Java模擬XN*2圖靈機(jī)”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識(shí)點(diǎn)還需要大家自己動(dòng)手實(shí)踐使用過(guò)才能領(lǐng)會(huì),如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI