如何使用Java模拟XN*2图灵机

发布时间:2022-02-19 16:00:11 作者:iii
来源:亿速云 阅读:147

本文小编为大家详细介绍“如何使用Java模拟XN*2图灵机”,内容详细,步骤清晰,细节处理妥当,希望这篇“如何使用Java模拟XN*2图灵机”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

题目描述:

对于XN*2图灵机进行模拟,任意给定的十进制数,转换为收缩扩展二进制的编码,再编程模拟此Turing机的运行过程,要求输出从开始运行起的每一步骤的结果。用C或C++或Java或Python语言实现程序解决问题。

要求:1. 程序风格良好(使用自定义注释模板);

2. 提供友好的输入输出,并进行输入数据的正确性验证。

源代码:

import java.util.*; 
/**
 * @description: 该类模拟XN*2图灵机,对任意给定的十进制数,转换为收缩扩展二进制的编码,并可输出运行中每一步骤的结果
 */
public class TuringMachine {
 
    private int internalState; // 图灵机的内态
    private String binCode; // 二进制编码
    Function f = new Function(); // 需要用到的方法
    List<String> binCodeList = new ArrayList<>(); // 用来存放二进制编码
 
    static int r = 0; // 当r为1时机器向右移动一格
    static int s = 0; // 当s为1时机器停止运行
 
    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: 模拟图灵机的运行过程
     * @param: [binCode 二进制编码]
     * @return: void
     */
    public void runProcess(String binCode) {
        binCodeList = f.toArrayList(binCode); // 将二进制码binCode转换为ArrayList类型存放在binCodeList中
        // for循环对binCodeList进行遍历,根据当前内态的值判断该执行哪条指令
        for (int i = 0; i < binCodeList.size(); i++) {
            r = 1;
            // 当s==1时机器停止,跳出循环
            if (s == 1) {
                break;
            }
            switch (getInternalState()) {
                // 内态为0时执行指令1
                case 0:
                    instruction_1(binCodeList.get(i), i, binCodeList);
                    break;
                // 内态为1时执行指令2
                case 1:
                    instruction_2(binCodeList.get(i), i, binCodeList);
                    break;
                // 内态为10时执行指令3
                case 10:
                    instruction_3(binCodeList.get(i), i, binCodeList);
                    break;
                // 内态为11时执行指令4
                case 11:
                    instruction_4(binCodeList.get(i), i, binCodeList);
                    break;
                default:
                    break;
            }
        }
        System.out.println("XN*2图灵机计算的最终结果为:");
        f.toDecNum(f.toString(binCodeList)); // 将binCodeList转换为String类型的二进制编码binCode,再转换为int类型的十进制数decNum
    } 
    /**
     * @description: 根据指令对每一步骤结果进行打印
     * 指令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 循环的次数从0开始, binCodeList 存放二进制编码binCode]
     * @return: void
     */
    private void instruction_1(String input, int i, List<String> binCodeList) {
        System.out.println("当前的内态为:" + getInternalState() + ",输入为:" + input);
        if (input.equals("0")) {
            System.out.println("执行此条指令后的内态为:" + getInternalState() + ",输入为:" + binCodeList.get(i) + ",右移");
            System.out.println("此步骤的结果为:");
            System.out.println(f.toString(binCodeList));
        }
        if (input.equals("1")) {
            setInternalState(1);
            binCodeList.set(i, "0");
            System.out.println("执行此条指令后的内态为:" + getInternalState() + ",输入为:" + binCodeList.get(i) + ",右移");
            System.out.println("此步骤的结果为:");
            System.out.println(f.toString(binCodeList));
        }
        System.out.println();
    }
 
    private void instruction_2(String input, int i, List<String> binCodeList) {
        System.out.println("当前的内态为:" + getInternalState() + ",输入为:" + input);
        if (input.equals("0")) {
            setInternalState(0);
            binCodeList.set(i, "1");
            System.out.println("执行此条指令后的内态为:" + getInternalState() + ",输入为:" + binCodeList.get(i) + ",右移");
            System.out.println("此步骤的结果为:");
            System.out.println(f.toString(binCodeList));
        }
        if (input.equals("1")) {
            setInternalState(10);
            binCodeList.set(i, "0");
            System.out.println("执行此条指令后的内态为:" + getInternalState() + ",输入为:" + binCodeList.get(i) + ",右移");
            System.out.println("此步骤的结果为:");
            System.out.println(f.toString(binCodeList));
        }
        System.out.println();
    }
 
    private void instruction_3(String input, int i, List<String> binCodeList) {
        System.out.println("当前的内态为:" + getInternalState() + ",输入为:" + input);
        if (input.equals("0")) {
            setInternalState(11);
            binCodeList.set(i, "1");
            System.out.println("执行此条指令后的内态为:" + getInternalState() + ",输入为:" + binCodeList.get(i) + ",右移");
            System.out.println("此步骤的结果为:");
            System.out.println(f.toString(binCodeList));
        }
        System.out.println();
    }
 
    private void instruction_4(String input, int i, List<String> binCodeList) {
        System.out.println("当前的内态为:" + getInternalState() + ",输入为:" + input);
        if (input.equals("0")) {
            setInternalState(0);
            binCodeList.set(i, "1");
            System.out.println("执行此条指令后的内态为:" + getInternalState() + ",输入为:" + binCodeList.get(i) + ",STOP");
            System.out.println("此步骤的结果为:");
            System.out.println(f.toString(binCodeList));
        }
        s = 1;
        System.out.println();
    }
 
    public static void main(String[] args) {
        TuringMachine tm = new TuringMachine(); // 创建TuringMachine的实例tm
        System.out.println("请输入一个十进制数:");
        Scanner scanner = new Scanner(System.in);
        try {
            int decNum = scanner.nextInt();
            tm.setBinCode(tm.f.toBinCode(decNum)); // 将十进制数转换为二进制编码并赋值给binCode
            System.out.println();
            tm.runProcess(tm.getBinCode()); // 运行图灵机
        } catch (InputMismatchException ex) {
            System.out.println("输入有误!");
        }
    } 
}
 
/**
 * @description: 该类具有图灵机TuringMachine运行过程中所需要的一些方法
 */
class Function {
 
    /**
     * @description: 将十进制数转换为二进制编码
     * @param: [decNum 十进制数]
     * @return: java.lang.String
     */
    public String toBinCode(int decNum) {
        String binCode = "";
        String binNum = Integer.toBinaryString(decNum); // 十进制数转换为二进制数
        binNum += ","; // 用,标识此二进制数到此已完整,后面的0都忽略不计
        System.out.println("这个数的二进制表示为:" + binNum);
        // 利用for循环对二进制数binNum中的字符进行遍历,根据其中的每个字符得出二进制编码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("这个数的二进制编码为:" + binCode);
        return binCode;
    }
 
    /**
     * @description: 将二进制编码转换为十进制数
     * @param: [binCode 二进制编码]
     * @return: int
     */
    public int toDecNum(String binCode) {
        int decNum = 0;
        String binNum = "";
        // 先利用for循环对ArrayList类型的binCode进行遍历,根据其中的每个元素得出二进制编码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("二进制表示:" + binNum);
        decNum = Integer.parseInt(binNum.substring(0, binNum.length() - 1), 2); // 将二进制编码binCode转化为十进制数
        System.out.println("十进制表示:" + decNum);
        return decNum;
    }
 
    /**
     * @description: 将二进制编码binCode存放到binCodeList中
     * @param: [binCode 二进制编码]
     * @return: java.util.List<java.lang.String>
     */
    public List<String> toArrayList(String binCode) {
        binCode = binCode.replaceAll("", " ").trim(); // 将binCode中的每个字符用空格分隔开,并去掉首尾的空格
        // 根据分隔符空格分隔出binCode中的每个字符存放到binCodeList中
        List<String> binCodeList = new ArrayList<>(Arrays.asList(binCode.split(" ")));
        return binCodeList;
    }
 
    /**
     * @description: 将binCodeList转换为二进制编码binCode
     * @param: [binCodeList 存放binCode的容器]
     * @return: java.lang.String
     */
    public String toString(List<String> binCodeList) {
        String binCode = String.join("", binCodeList);
        return binCode;
    } 
}

读到这里,这篇“如何使用Java模拟XN*2图灵机”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注亿速云行业资讯频道。

推荐阅读:
  1. JAVA从文件中读取数据的方法是什么
  2. Java 8中怎么利用Streams API对Stream进行分组和分区

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

java

上一篇:java后端开发要学习哪些知识

下一篇:java如何拆解字节码文件

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》