所以我试图对超立方体提出递归解决方案,其中步行方法允许您步行到超立方体中的每个点。例如,如果你放 walk(3) 控制台应该输出:
000, 001, 011, 010, 110, 111, 101, 100
我已经使用灰码为这个问题制定了一个迭代解决方案,因为我的心态是每个点距离另一个点只有 1 位,所以我只需要在每个循环中移位一次。然后我尝试以递归的方式做同样的事情。我不允许使用数组、列表、堆栈等任何类型的问题,这是我提出的递归解决方案:
递归解决方案:
public static void recursiveWalk(int n)
{
if (n < 1)
{
System.out.print("no");
}
else
{
String ass = "";
recursiveWalkHelper(n, 0, ass);
System.out.print(ass);
}
}
public static void recursiveWalkHelper(int n, int i, String str)
{
int N = 1 << n;
if (i < N)
{
int x = i ^ (i >> 1);
getGrayCode(x, n, str, 0, 0, 0);
System.out.println();
i++;
recursiveWalkHelper(n, i, str);
}
return;
}
public static void getGrayCode(int x, int n, String str, int i, int j, int k)
{
if (x > 0)
{
str = str + x % 2;
x = x / 2;
i++;
getGrayCode(x, n, str, i, j, k);
}
if (j < n - i)
{
System.out.print('0');
j++;
getGrayCode(x, n, str, i, j, i - 1);
return;
}
if (k >= 0)
{
System.out.print(str.charAt(k));
i--;
getGrayCode(x, n, str, i, j, k);
return;
}
return;
}
但是,当我将 recursiveWalk(3) 放入 main 时,代码的输出如下:
000
00100010
0101001010010101010
0100001000000000000
0010000010000110001100000000000000000000000
1010101010100110101101001101011010110101010
1000101000100000100001001101011010110101010
0000000000000000000000000000000000000000000
这不是我所期待的。我想强调一下,我并不打算使用任何形式的问题,所以我只使用了字符串和简单的打印输出
这是我提出的可行的迭代解决方案:
static void iterativehelper(int x, int n)
{
String ass = "";
int i = 0;
for (i = 0; x > 0; i++)
{
ass = ass + x % 2;
x = x / 2;
}
// leftmost digits are
// filled with 0
for (int j = 0; j < n - i; j++)
{
System.out.print('0');
}
for (int j = i - 1; j >= 0; j--)
{
System.out.print(ass.charAt(j));
}
}
// Function to generate
// gray code
static void iterative(int n)
{
int N = 1 << n;
for (int i = 0; i < N; i++)
{
// generate gray code of
// corresponding binary
// number of integer i.
int x = i ^ (i >> 1);
// printing gray code
iterativehelper(x, n);
System.out.println();
}
}