额,花了半个小时时间做出来了,应该还比较好懂吧,你看看。建议从main方法开始看起。然后再看前面这个建塔的方法。
public class NumberTower
{
public static void towerBuild(int n,int[][] arr)
{
int mid = (2*n-1)/2;
int[][] key = new int[n][2]; //这个数组用来记录每一行中,值为1的元素的下标
//把三角形的两条边完成
arr[0][mid] = 1;
int midLeft = mid;
int midRight = mid;
for (int i = 1; i < n; i++)
{
arr[i][--midLeft] = 1;
arr[i][++midRight] = 1;
key[i][0] = midLeft;
key[i][1] = midRight;
}
//开始完成三角形内部,使得每个元素的值都是它的两肩上的值的和
for (int i = 2; i < n; i++) //从第三行的元素开始,因为第二行没有元素有两个肩
{
for (int j = key[i][0]+2; j < key[i][1]; j=j+2)
{
arr[i][j] = arr[i-1][j-1] + arr[i-1][j+1]; //应该看得懂吧,等号右边这两个元素,就是所谓的两个肩膀啦。
}
}
}
public static void main(String[] args)
{
int n = 5;
int[][] arr = new int[n][2*n-1];
//先将这个数组全部赋值为0,为了方便在打印的时候与那些非0的元素区分开
for (int i = 0; i < n; i++)
{
for (int j = 0; j < 2*n-1; j++)
{
arr[i][j] = 0;
}
}
towerBuild(n,arr);
//打印这个数组,不过值为0的元素用空格代替
for (int i = 0; i < n; i++)
{
for (int j = 0; j < 2*n-1; j++)
{
if (arr[i][j] == 0)
{
System.out.print(" ");
}else {
System.out.print(arr[i][j]);
}
}
System.out.println();
}
}
}
|