Java实现模拟图灵机x*2的运行过程

该博客介绍了如何使用Java编程模拟XN*2的图灵机运算过程。首先将十进制数转换为二进制,然后转换为图灵机二进制编码。接着,通过遍历字符串并应用图灵机指令集,逐步展示运算步骤。在过程中,使用了StringBuffer类以避免频繁创建新字符串对象,提高了效率。文章还反思了编程过程中的问题和学习心得。
摘要由CSDN通过智能技术生成

Java实现模拟图灵机x*2的运行过程

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

~~~~~~~~~~~~过度线~~~~~~~~~~~~
== v==

编程新手跳转学习Hello World!

编程新手跳转学习作业三天打鱼两天晒网
图灵机,又称图灵计算、图灵计算机,是由数学家艾伦·麦席森·图灵(1912~1954)提出的一种抽象计算模型,即将人们使用纸笔进行数学运算的过程进行抽象,由一个虚拟的机器替代人们进行数学运算。所谓的图灵机就是指一个抽象的机器,它有一条无限长的纸带,纸带分成了一个一个的小方格,每个方格有不同的颜色。有一个机器头在纸带上移来移去。机器头有一组内部状态,还有一些固定的程序。在每个时刻,机器头都要从当前纸带上读入一个方格信息,然后结合自己的内部状态查找程序表,根据程序输出信息到纸带方格上,并转换自己的内部状态,然后进行移动

0 0→0 0R
0 1→1 0R
1 0→0 1R
1 1→10 0R
10 0→11 1R
11 0→0 1STOP
这是图灵机XN*2的指令集

这是字符串的常用方法:
length() 查看字符串的长度
charAt() 定位某个字符,返回它的位置
lastIndexOf() 某个字符最后一次出现的位置
substring() 截取子串,如果参数有两个左闭右开[1,5)
equals() 判断两个串是否相等,注意String重写了Object的此方法,所以内容相同就返回true
startsWith() 判断是不是以参数开头
endsWith() 判断是不是以参数结尾
split() 以指定字符分割
trim() 去掉首尾两端的空格
getBytes() 把串转换成数组
toUpperCase() 变成全大写
toLowerCase() 变成全小写
String.valueOf(10) 把int类型的10转换成String类型

String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,不仅效率低下,而且浪费大量优先的内存空间

**StringBuffer是可变类,和线程安全的字符串操作类,任何对它指向的字符串的操作都不会产生新的对象。每个StringBuffer对象都有一定的缓冲区容量,当字符串大小没有超过容量时,不会分配新的容量,当字符串大小超过容量时,会自动增加容量 **

StringBuilder可变类,速度更快

这下面是代码

代码:

主要模拟过程

package 图灵机;
import java.util.Scanner;
public class 图灵机 {
    public static void main(String[] args) {
        Scanner a =new Scanner(System.in);
        System.out.println("输入一个数字:");
        int b=a.nextInt();
        if(b<=0){
            System.out.println("不行,重新输入");
            return;
        }
        String c= zhuan(b);
        String d= zhuan1(c);
        String f= tuling(d);
    }

十进制转换为二进制

    private static String zhuan(int n) {
        String result = "0"+Integer.toBinaryString(n)+",";
        System.out.println("转换为二进制在前面加上0后面加上一个,结果为为:"+result);
        return result;
    }

二进制转换为图灵机二进制

 private static String zhuan1(String m) {
     String result1 = m.replace("1","10").replace(",","110");
     System.out.println("转换为二进制拓展为:"+result1);
     return result1;
 }

对于图灵机最主要的过程

 public static String tuling(String e) {
     StringBuffer c = new StringBuffer(e);
     int nei = 0;  //内态,默认为零
     for (int i = 0; i < c.length(); i++) {
         // 0 0 --> 0 0 R
         if (nei == 0 && c.charAt(i) == '0') {
             System.out.println("第" + (i + 1) + "次运算, 此时内态0 输入0, 运算后内态0 输出0, 此时值:" + c);continue;
         }
         // 0 1 --> 1 0 R
         if (nei == 0 && c.charAt(i) == '1') {
             nei = 1;
             c.setCharAt(i, '0');
             System.out.println("第" + (i + 1) + "次运算, 此时内态0 输入1, 运算后内态1 输出0, 此时值:" + c);continue;
         }
         // 1 0 --> 0 1 R
         if (nei == 1 && c.charAt(i) == '0') {
             nei= 0;
             c.setCharAt(i, '1');
             System.out.println("第" + (i + 1) + "次运算, 此时内态1 输入0, 运算后内态0 输出1, 此时值:" + c);continue;
         }
         // 1 1 --> 10 0 R
         if (nei == 1 && c.charAt(i) == '1') {
             nei = 10;
             c.setCharAt(i, '0');
             System.out.println("第" + (i + 1) + "次运算, 此时内态1 输入1, 运算后内态10 输出0, 此时值:" + c);continue;
         }
         // 10 0 --> 11 1 R
         if (nei == 10 && c.charAt(i) == '0') {
             nei = 11;
             c.setCharAt(i, '1');
             System.out.println("第" + (i + 1) + "次运算, 此时内态10 输入0, 运算后内态11 输出1, 此时值:" + c);continue;
         }
         // 11 0 --> 0 1 STOP
         if (nei == 11 && c.charAt(i) == '0') {
             nei = 0;
             c.setCharAt(i, '1');
             System.out.println("第" + (i + 1) + "次运算, 此时内态11 输入0, 运算后内态0 输出1, 此时值:" + c);
         }
     }
     return c.toString();
 }
}

调试与运行结果:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

心得:

首先对于这次作业,我觉得我的思路一开始不太清晰,不知道用什么方法完成,但java课程刚好学到了字符串,并且可以完成运用到此次实验中,于是用它自带的方法就可以很容易将十进制转化为二进制再转化为图灵机二进制,主要问题是再把自己的思想转化为代码时转换有点失误。其接下来都比较顺利。
对于这次的不足就是,我没能合理的运用到一些更好的方法,并且程序可能会不太完善,希望我可以掌握更多的编程技巧,还有这次我发现,在修改代码时应该让别人来帮你来进行修改,这样对于学习来说比较快,而且很容易发现问题所在。

.
.
.
==友情提醒==
.
.
.
敲码需认真,参考需理性
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值