从键盘输入一个整数(1~20)则以该数字为矩阵的大小,把1,2,3…n*n 的数字按照顺时针螺旋的形式填入其中。
例如:输入数字2,则程序输出:
1 2
4 3
输入数字3,则程序输出:
1 2 3
8 9 4
7 6 5
输入数字4,则程序输出:
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
分析:用二维数组解决,从对角线分析,找出规律。1,1+4(n-1),1+4*2*(n-2),……
根据n确定可把该二维数组划分成多少环,也就是说,第一环的第一个元素为1,第二环的第一个元素为1+4(n-1),……
写算法,先确定第一环的算法,写在一个方法中,让该方法同时适应第二环,第三环,……
源代码如下:
package com.lzw.cnum;
public class CirNum { int[][] num = null; int circle = 0; int n = 0; public CirNum(int n) { super(); this.n = n; this.num = new int[n][n]; } // 当输入的n>1时,用该方法填充第一环。 public void lauchRect(int index, int first) { // 对参数的注释,first表示左上角的第一个元素。index左上角元素的下标值(即第(index+1)环)。 this.circle = (n + 1) / 2; int i = index, j = index; // 处理最第一行。 for (; j < n - 1 - index; j++) { // 之所以减去index是因为把内环又当成新环用。 this.num[i][j] = first + j - index; } // 处理最后一列。 for (; i < n - 1 - index; i++) { this.num[i][j] = first + (n - 1 - 2 * index) + i - index; } // 处理最后一行。 for (; j - index > 0; j--) { this.num[i][j] = first + 2 * (n - 1 - 2 * index) + (n - j - 1) - index; } // 处理第一列。 for (; i - index > 0; i--) { this.num[i][j] = first + 3 * (n - 1 - 2 * index) + (n - i - 1) - index; } //如果n是奇数,确定该矩阵中中间元素。 if (n % 2 != 0) { this.num[(n - 1) / 2][(n - 1) / 2] = n * n; } // 递归。 if (index < this.circle) { index++; System.out.println("index= " + index); this.lauchRect(index, 1 + index * 4 * (n - index)); } } public void display(int n) { for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { System.out.print(this.num[i][j] + " "); } System.out.println(); } } public static void main(String[] args) { int flag = 4;// 设置输入的数字。 CirNum cir = new CirNum(flag); cir.lauchRect(0, 1); cir.display(flag); } }
相关推荐
对于递归算法而言,确定一个合适的终止条件至关重要,这是避免无限递归的关键。 ##### 递归步骤 递归步骤定义了如何将大问题转化为小问题的过程,并且最终会归结到基本情况。递归步骤需要精心设计以确保每一次递归...
在提供的`查找指定文件.rar`压缩包中,可能包含了一个VC++工程文件,用于演示非递归算法的实现。代码中可能包含一个函数,如`TraverseDirectory()`,它使用Windows API如`FindFirstFile()`, `FindNextFile()`和`...
快速排序通过选取一个基准值,将数组分为小于和大于基准值的两部分,然后分别对这两部分进行递归排序。 - **动态规划**:一些优化问题,如斐波那契数列、背包问题、最长公共子序列等,可以通过递归配合记忆化搜索来...
在ACM(国际大学生程序设计竞赛)中,递归算法是一种常见的解决问题的方法,它通过函数自身调用自身来实现问题的解决。递归的核心在于找到基本情况(base case),即可以直接求解的问题,以及每次递归调用时问题规模...
本文将深入探讨一个ABAP中的简单递归算法——计算阶乘,并通过SE38报表的形式进行展示。 #### 二、递归算法简介 递归算法是一种通过调用自身来解决问题的方法。它通常用于解决那些可以通过子问题的解来构建整个...
关于递归算法时间复杂度分析的探讨,是一个深入理解算法效率和优化的关键议题。递归,作为解决问题的一种强大工具,其本质是将复杂问题分解为更简单的子问题,通过求解这些子问题来达到最终解决方案的目的。然而,...
这种策略在现代编程和软件工程中尤为常见,很多情况下,一个复杂的问题可以通过分解成一系列更简单的子问题来解决,而非递归算法正是这种思想的具体体现。通过这种方式,我们不仅能够有效地解决问题,还能优化程序的...
### Hanoi塔问题的一种非递归算法:深入解析与实现 #### 一、引言 Hanoi塔问题作为计算机科学领域内经典的递归问题之一,因其简洁性和挑战性而广受关注。通常,Hanoi塔问题的解决方案多采用递归算法,尽管其逻辑...
在这个版本中,我们初始化一个变量`result`为1,然后通过循环乘以从2到`n`的所有整数,最终得到阶乘的结果。这种方法不需要存储额外的调用栈,通常更有效率。 递归和非递归算法的选择取决于问题的特性、性能需求...
* 搜索链表最后一个结点并打印其数值的递归算法 * 汉诺塔问题的递归算法 9. 递归算法的实现细节: * 递归函数的实现细节取决于具体的问题和语言。 * 递归函数的实现细节需要考虑栈的溢出和性能问题。 递归...
递归算法是指在程序设计中,在调用一个函数的过程中又出现直接或间接调用其函数本身的现象。递归算法的优点是编写容易,结构清晰,可读性强,但是其缺点是计算速度慢,时间花费较长,效率也会随着问题规模的增大而...
递归算法的核心在于它的自相似性,即一个问题的解可以通过解决规模更小的相同问题得到。在合并排序中,我们首先将数组分为两半,然后对每一半分别进行排序(这是递归调用),最后将两个有序的子数组合并成一个大的...
递归算法应用:删除某一个节点的子树算法 递归算法是计算机科学中的一种重要算法设计技术,通过将问题分解成更小的子问题,以解决复杂的问题。在数据结构中,递归算法广泛应用于树形结构的操作,例如二叉树的遍历、...
递归算法是一种强大的编程技术,它通过函数或过程在解决问题时调用自身来解决更小规模的相同问题。递归的基本概念在于一个函数在定义中包含对自身的引用,或者问题的解决方案依赖于较小规模问题的解决方案。在程序...
### 递归算法专题知识点详解 #### 一、递归算法原理 递归算法是一种将问题分解成子问题的方法,其中子问题与原问题性质相同但规模较小。递归算法的关键在于识别出能够通过递归解决的问题,并找到递归的基本情况...
18.递归算法与递归算法应用.ppt
### 递归算法在程序设计中的应用 #### 一、递归的概念与本质 递归是一种重要的编程思想,在计算机科学和数学领域都有广泛的应用。它指的是一个过程或函数直接或间接地调用自身来解决问题的方法。递归的核心在于将...
快速排序算法设计与分析总结 二叉树与树的转换前序、后序的递归、非递归算法,层次序的非递归算法的实现 二叉树与树的转换前序、后序的递归、非递归算法,层次序的非递归算法的实现,应包含建树的实现 实现树与...
递归算法转为非递归算法。方法、过程,用栈的原理