我决定练习,我将创建一个二进制计数器,模拟图灵机的方法。具体来说,我计划模仿下面的第一个例子:(https://www.cl.cam.ac.uk/projects/raspberrypi/tutorials/turing-machine/four.html),然后我将更进一步为我的机器创建更多的东西!
我对这个例子的适应是,我希望有一个可以计数到的设置数,然后停止-而不是一次递增1。
我使用开关情况,因为我已经有一段时间没有使用它们了,之前,我有相同的(修改过的)代码用于if- cases块。
我目前面临的问题是,我的柜台似乎还没有超过“磁带”上的两步。下面显示它可能会被困在某个地方。我怀疑它就在这里:
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++;
}
}
}我希望得到的是,最不重要的比特是第一位。
发布于 2015-01-30 09:44:12
在我看来,你似乎是在假设每一步都会涉及到二进制数的增量。你的“脚步”只跑了8次。但是其中许多步骤根本不涉及更改“磁带”--在状态0和状态2中,“头”被移动,状态被更改,但是磁带没有任何更改。
如果你知道你想要的's‘的最后状态(大概是"1000"),那么最简单的事情就是用while (!String.valueOf(s).equals("1000"))代替while (!String.valueOf(s).equals("1000"))。
https://stackoverflow.com/questions/28229614
复制相似问题