经过搜索后发现csdn上大多递归实现的螺旋数组都有问题。
在反复debug之后我自己终于实现了用递归的方式构建螺旋数组。
递归思想:螺线数组由一层层的正方形框组成
外层与内层的区别就是边长和初始数字不同
而当边长为1 和 2 时是特殊情况作为结束条件
由此就可以写出递归函数如下:
import java.util.Scanner;public class SpiralArrayRecursion { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("input n"); int n = sc.nextInt(); int[][] nums = new int[n][n]; f(1,n,1,nums); for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { System.out.print(nums[i][j] + " " ); } System.out.println("n"); } } public static int[][] f(int startNum,int n,int k,int[][] nums){ //int[][] nums = new int[n][n]; //n = 1或2 时结束递归 if(n == 1){ nums[k - 1][k - 1] = startNum; return nums; }else if(n == 2){ nums[k - 1][k - 1] = startNum++; nums[k - 1][k] = startNum++; nums[k][k] = startNum++; nums[k][k - 1] = startNum++; return nums; } //构造外层正方形 int col = n;//右列数及下行数 int r = k - 1; //上行 for (int i = 0; i < col; i++) { nums[k - 1][k - 1 + i] = startNum++; } //右列 for (int i = 0; i < col - 1; i++) { nums[k + i][k + col - 2] = startNum++; } //下行 for (int i = 0; i < col - 1; i++) { nums[k + col - 2][col + k - 3 - i] = startNum++; } //左列 for (int i = 0; i < col - 2; i++) { nums[col + k - 3 - i][k - 1] = startNum++; } return f(startNum,n - 2,k + 1,nums); }}
代码运行结果如下:
偶数:n = 6时
奇数:n = 5时