所以,我们有一个功课问题,要求我们创建一个角落的超立方体2 ^ n。并且每个角在x1,x2,x3 ...... xn的平面中具有一组n坐标。因此,n = 3超立方体具有如下坐标: 在平面x1,x2,x3中的000,001,011,010等。
编写这个程序的重点是有一个递归方法和一个迭代方法来“遍历”超立方体并且每个角落只传递一次而不重叠它的踪迹。教授还要求我们的Corner对象是超立方体类中的嵌套类。到目前为止,这是我提出的:
ublic class Hypercube {
private Corner[] walk;
private int size;
private final int ZERO = 0;
private int count;
public Hypercube(int n) throws IllegalHypercubeException {
if (n < 0) {
throw new IllegalHypercubeException("Please enter a positive integer");
} else {
this.size = n;
this.count = 0;
this.walk = new Corner[(int) Math.pow(2, n)];
}
}
public class Corner
{
private int[] coordinates;
public Corner() {
this.coordinates = new int[size];
}this.coordinates = coordinates;
}
在我甚至可以在walk方法中递归排序之前,我发现设置坐标最困难。我是怎么设置2 ^ n个角的立方体每个角的所有坐标?
答案 0 :(得分:0)
不打算为它编写代码(那是你的工作),但这里有一些东西可以帮助你:
在1D中 - 角落将是{0}和{1}
在2D中 - 角落将是
{
{0,0}, {0,1},
{1,0}, {1,1}
}
在3D中 - 角落将是
{
{0,0,0}, {0,0,1}, {0,1,0}, {0,1,1},
{1,0,0}, {1,0,1}, {1,1,0}, {1,1,1}
}
如果你仍然没有啊哈!的时刻,那么这就是扰流板:通过在N的所有角上添加前缀来制作N维角的列表-1维0
然后1
。
答案 1 :(得分:0)
当你通过它的边缘遍历超立方体时,你会在每一步都改变一个坐标。注意,有一些特殊的二进制序列,其中只有一个位在相邻元素之间翻转。
查看Gray codes(n维超立方体的n位代码) - 它们已被很好地描述,存在大量递归和迭代生成序列的方法。