实现效果图如下:(4*4矩阵) 实现代码: package com.feng.test; public class Test { // 新建二维数组,保存矩阵的值 int[][] array = null; public static void main(String[] args) { new Test().test(4); } public void test(int n) { array = new int[n][n]; result(n, n - 1, n, 0, (n - 1) * 4); // 输出矩阵的值 for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { System.out.print(array[i][j] + "/t"); } System.out.println("/n"); } } /** * 求n*n矩阵的值 * * @param n * 矩阵数,递减,每次-2,到0或者1为止 * @param index * 当前矩阵的最大索引 * @param m * 矩阵的开始数 * @param time * 第几个矩阵,从0开始 * @param max * 当前矩阵的最大值 */ public void result(int n, int index, int m, int time, int max) { // 表示矩阵每一边2个顶点之间的间隔点数,矩阵公4个边,4个顶点 int count = n - 1; // 个数(总共有多少个点数) int num = count * 4; // 本矩阵的开始值(矩阵的第一个顶点的值) int one = max - num + 1; // 本矩阵的开始值(矩阵的第一个顶点的值) int two = one + count; // 本矩阵的结束值(矩阵的第三个顶点的值,第三个顶点与第一个顶点之间隔个2个顶点,故*2) int three = one + count * 2; // 本矩阵的结束值(矩阵的第四个,最后一个顶点的值) int four = one + count * 3;// 或者four=max-count-1 // 矩阵的最大值 int maxs = max; // 本矩阵Y轴的开始索引 int y1 = index + 1 - n; // 本矩阵Y轴的最大索引 int y2 = index; // 本矩阵X轴的开始索引 int x1 = index + 1 - n; // 本矩阵X轴的最大索引 int x2 = index; // +time或者-time主要是使顶点处的值加索引为0,4个顶点只能加0,因为每次递归下一个矩阵,第一个顶点的索引就会从0开始依次加1 for (int i = y1; i <= y2; i++) { for (int j = x1; j <= x2; j++) { // 给矩阵X轴的最上边赋值,从第1个顶点开始依次加1,到第2个顶点为止 if (i == y1) { array[i][j] = one + (j - time); } // 给矩阵Y轴的最右边赋值,从第2个顶点开始依次加1,到第3个顶点为止 if (j == x2) { array[i][j] = two + (i - time); } // 给矩阵X轴的最下边赋值,从第4个顶点开始依次减1,到第3个顶点为止 if (i == y2) { array[i][j] = four - j + time; } // 给矩阵Y轴的最左边赋值,从最大值处(第1个顶点的下方)开始依次减1,到第4个顶点为止 if (j == x1) { // 排除第一个顶点,因为第1个顶点与最大值之间相隔>1 if (i != y1) { array[i][j] = max - i + time + 1; } } } } // 下一个矩阵数 n = n - 2; // 下一个矩阵的最大索引 index = index - 1; // 下一矩阵的个数,点数 num = (n - 1) * 4; // 下一个矩阵的最大值 max = max + num; // 递归下一个矩阵,每一个矩阵之间隔2,偶数到0,奇数到1(最后一个最大) if (n != 0 && n != 1 && n > 0) { result(n, index, m, time + 1, max); } // 给奇数最后一个赋值 if (n == 1) { array[m / 2][m / 2] = m * m; } } }