[英]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.