递归实现螺旋方阵

记得我大一到时候,学校老师就给我们做螺旋方阵的题目,当时我是用循环做的,就是设置一个while 循环,用一个i 变量从1 开始加,结束循环的条件是,判断i是否为N*N ,(N是输入的N行N列矩阵).

  • -好像,用循环,也挺好做的,不过这次讲递归真么做
#include<stdio.h>                           //使用库函数printf和scanf
            #define N 10                                     //定义符号常量N
            int data[N][N]={0};                            //定义全局数组data[N][N]并初始化为0
            void Full(int number,int begin,int size);     //函数声明,填写旋转方阵
            void OutPrint(int size);                      //函数声明,输出旋转方阵
                                                           //空行,以下是主函数
            int main ()
            {
              int n;
              printf("请输入方阵的阶数(小于10):"); //输出提示信息
              scanf("%d",&n);
              Full(1,0,n);                            //函数调用,从1开始填写n阶方阵,左上角的下标为(0,0)
              OutPrint(n);                              //函数调用,输出n阶方阵
              return 0;                                    //将0返回操作系统,表明程序正常结束
            }
                                                           //空行,以下是其他函数定义
            void Full(int number,int begin,int size)
            {                                              //从number开始填写size阶方阵,左上角的下标为(begin,begin)
              int i,j,k;
              if(size==0)                                //递归的边界条件,如果size等于0,则无须填写
                  return;
              if(size==1)                               //递归的边界条件,如果size等于1
              {
                  data[begin][begin]=number;        //则只须填写number

                  return;
              }
              
              
              i=begin;j=begin;                           //初始化左上角下标
              for(k=0;k<size-1;k++)                   //填写区域A,共填写size-1个数
              {
                  data[i][j]=number;number++;            //在当前位置填写number
                  i++;                                    //行下标加1
              }
              
              
              for(k=0;k<size-1;k++)                   //填写区域B,共填写size-1个数
              {
                  data[i][j]=number;number++;            //在当前位置填写number
                  j++;                                    //列下标加1
              }
              
              
              for(k=0;k<size-1;k++)                   //填写区域C,共填写size-1个数
              {
                  data[i][j]=number;
				  number++;            //在当前位置填写number
                  i--;                                    //行下标减1
              }
              for(k=0;k<size-1;k++)                   //填写区域D,共填写size-1个数
              {
                  data[i][j]=number;number++;            //在当前位置填写number
                  j--;                                    //列下标减1
              }
              
              Full(number,begin+1,size-2);            //递归调用,左上角下标为begin+1
              return;                                     //结束函数Full的执行
            }
            void OutPrint(int size)                        //函数调用,输出size阶方阵
            {
              int i,j;
              for(i=0;i<size;i++)                     //输出第i行
              {
                  for(j=0;j<size;j++)                 //输出第j列
                    printf("%4d",data[i][j]);
                  printf("\n");                       //输出一行后输出换行符
              }
              return;                                     //结束函数OutPrint的执行
            }

(温馨提醒: 左边是A 区域,下边是B 区域,右边是C区域,上边是D 区域)在这里插入图片描述
递归,涉及了分治的思想在里边,就是把一个问题,分成很多个子问题,每个子问题的解决方法都是一样的。然后,我们把子问题都解决了,大问题就解决了。

©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页