Java 图灵机二进制计数器

Java 图灵机二进制计数器,java,binary,turing-machines,Java,Binary,Turing Machines,为了练习,我决定创建一个模拟图灵机器方法的二进制计数器。具体地说,我计划模仿下面的第一个示例:(),然后我将更进一步,为我的机器创建更多 我对这个例子的适应是,我希望有一个设定的数字进行计数,然后停止,而不是一次递增1 我之所以使用switch cases,是因为我有一段时间没有使用它们了,早些时候,我为if-else块使用了相同的(改编的)代码 我现在面临的问题是,我的计数器似乎没有通过“磁带”上的2个前进。下面显示它可能卡在某个地方。我怀疑是在这里: case 2: switch (

为了练习,我决定创建一个模拟图灵机器方法的二进制计数器。具体地说,我计划模仿下面的第一个示例:(),然后我将更进一步,为我的机器创建更多

我对这个例子的适应是,我希望有一个设定的数字进行计数,然后停止,而不是一次递增1

我之所以使用switch cases,是因为我有一段时间没有使用它们了,早些时候,我为if-else块使用了相同的(改编的)代码

我现在面临的问题是,我的计数器似乎没有通过“磁带”上的2个前进。下面显示它可能卡在某个地方。我怀疑是在这里:

case 2:
    switch (symbol) {
        case ' ':
            s[i] = ' ';
            state = 0;
            i++;
            break; // here? 

在这个类中放置一个增量函数并在
中调用它会更明智吗(c在我看来,似乎您假设每个步骤都会涉及二进制数的增量。您只运行了8次“步骤”。但其中许多步骤根本不涉及更改“磁带”-在状态0和状态2,“磁头”移动,状态更改,但磁带没有更改


如果您知道所需的“s”的最终状态(大概是“1000”),那么最简单的方法是将
while(c<8)
替换为
while(!String.valueOf(s).equals(“1000”))

谢谢你的建议!虽然这无助于解决不前进的问题。在
i
停留在
0
和它在状态和符号之间交替使用
0
1
之间有一个无限循环。我会继续搜索。@TeloSprings你还在寻求这方面的帮助吗?我可以如果您仍在努力解决这个问题,我有一些关于如何找到问题的建议。我已经解决了这个问题!谢谢您的建议。我对最低有效位方面有一个小小的误解,并且字符数组有太多的条目使得
equals()
无法工作。我会将您的答案标记为正确。
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++;
        }
    }
}