首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >图灵机二进制计数器

图灵机二进制计数器
EN

Stack Overflow用户
提问于 2015-01-30 05:12:22
回答 1查看 1.6K关注 0票数 0

我决定练习,我将创建一个二进制计数器,模拟图灵机的方法。具体来说,我计划模仿下面的第一个例子:(https://www.cl.cam.ac.uk/projects/raspberrypi/tutorials/turing-machine/four.html),然后我将更进一步为我的机器创建更多的东西!

我对这个例子的适应是,我希望有一个可以计数到的设置数,然后停止-而不是一次递增1。

我使用开关情况,因为我已经有一段时间没有使用它们了,之前,我有相同的(修改过的)代码用于if- cases块。

我目前面临的问题是,我的柜台似乎还没有超过“磁带”上的两步。下面显示它可能会被困在某个地方。我怀疑它就在这里:

代码语言:javascript
复制
case 2:
    switch (symbol) {
        case ' ':
            s[i] = ' ';
            state = 0;
            i++;
            break; // here? 

是否更明智的做法是在这个类中添加一个增量函数,并将其在while (c<8)中调用为增量1,如上面的示例所示?但这不需要调用静态变量吗?后来,当我为我的机器创建更多的操作时,会产生问题,是吗?

代码语言:javascript
复制
public class TuringMachineSimulations {

    private static void print(char[] s) {
        for (int i = 0; i < s.length; i++) {
            System.out.print(s[i] + "_");
        }
        System.out.println();
    }

    public static void main(String[] args) {

        int n = 8; // number to count up to in binary 
        int c = 0; // counter
        int i = 0; // index counter within 'string'
        int state = 0; // state control
        char symbol = ' '; // what symbol is currently being read - starting is blank
        char[] s = new char[4]; // 4 bits needed to hold the integer "8" in binary

        while (c < 8) {
            switch (state) {
            case 0:
                switch (symbol) {
                case ' ':
                    s[i] = ' ';
                    state = 1;
                    i++;
                    break;
                case '0':
                    s[i] = '0';
                    state = 0;
                    i--;
                    break;
                case '1':
                    s[i] = '1';
                    state = 0;
                    i--;
                    break;
                default:
                    break;
                }
            case 1:
                switch (symbol) {
                case ' ':
                    s[i] = '1';
                    state = 2;
                    i--;
                    break;
                case '0':
                    s[i] = '1';
                    state = 2;
                    i++;
                    break;
                case '1':
                    s[i] = '0';
                    state = 1;
                    i++;
                    break;
                default:
                    break;
                }
            case 2:
                switch (symbol) {
                case ' ':
                    s[i] = ' ';
                    state = 0;
                    i++;
                    break;
                case '0':
                    s[i] = '0';
                    state = 1;
                    i--;
                    break;
                case '1':
                    s[i] = '1';
                    state = 1;
                    i--;
                    break;
                default:
                    break;
                }
            }
            symbol = s[i];
            print(s);
            c++;
        }
    }
}

我希望得到的是,最不重要的比特是第一位。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-30 09:44:12

在我看来,你似乎是在假设每一步都会涉及到二进制数的增量。你的“脚步”只跑了8次。但是其中许多步骤根本不涉及更改“磁带”--在状态0和状态2中,“头”被移动,状态被更改,但是磁带没有任何更改。

如果你知道你想要的's‘的最后状态(大概是"1000"),那么最简单的事情就是用while (!String.valueOf(s).equals("1000"))代替while (!String.valueOf(s).equals("1000"))

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28229614

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档