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