图灵机二进制计数器

时间:2015-01-30 05:12:23

标签: java binary turing-machines

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

我对这个例子的改编是我希望有一个数字可以计算,然后停止 - 而不是一次增加1。

我正在使用switch case,因为我之前没有使用过它们,之前我有if-else块的相同(改编)代码。

我现在遇到的问题是我的计数器似乎没有超过“磁带”上的2个进展。下面显示它可能卡在某处。我怀疑它在这里:

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

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

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++;
        }
    }
}

P.S。我希望得到这样的最低位是第一位。

1 个答案:

答案 0 :(得分:0)

在我看来,好像你假设每一步都涉及二进制数的增量。您正在执行您的步骤&#39;只有8次。但是,其中许多步骤并不涉及更改“胶带”。根本没有 - 在0和2州的头部&#39;移动,状态改变但磁带没有变化。

如果你知道&#39;的最终状态。你想要的(大概是&#34; 1000&#34;)然后最简单的方法是用while (c < 8)替换while (!String.valueOf(s).equals("1000"))