簡體   English   中英

圖靈機二進制計數器

[英]Turing Machine Binary Counter

為了實踐,我決定創建一個二進制計數器來模擬圖靈機的方法。 具體來說,我打算從中模擬第一個示例:( https://www.cl.cam.ac.uk/projects/raspberrypi/tutorials/turing-machine/four.html )然后,我將進一步進行創建我的機器還有更多!

我對本示例的適應是,我希望有一個設定的數字可以累加,然后停止-而不是一次增加1。

我之所以使用開關盒,是因為我已經有一段時間沒有使用它們了,更早的時候,我為if-else塊使用了相同的(適應的)代碼。

我目前遇到的問題是,我的計數器似乎沒有超過“磁帶”上的2個預付款。 下面顯示它可能卡在某處。 我懷疑它在這里:

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

如上例所示,將增量函數放在此類中並在while (c<8)調用該函數將其遞增一會更明智嗎? 但是那不需要調用靜態變量嗎? 以后,當我為機器創建更多操作時,會出現問題嗎?

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

PS我希望得到它,以便最低有效位是第一位。

在我看來,您似乎假設每個步驟都將涉及二進制數的增量。 您的“步驟”僅運行8次。 但是其中許多步驟根本不涉及更改“磁帶”-在狀態0和2中,“磁頭”已移動,狀態已更改,但磁帶沒有更改。

如果知道所需的's'的最終狀態(大概是“ 1000”),那么最簡單的方法是將while (c < 8)替換為while (!String.valueOf(s).equals("1000"))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM