对于书上那个日程表的实现,第三版的课本给出了循环实现的方法,不过这个表的生成明显要用递归方法生成更为合适,此表如下:
可以看到每次该表的生成总可以分成四个字表的填充过程,初始化让左边第一列填充上之后,然后每一次先递归填充左上角的子表,然后再填充左下角的子表,然后右上和右下的子表用copy的方法填充,实现代码如下:
1 #include<iostream> 2 using namespace std; 3 const int SIZE = 100; 4 int table[SIZE][SIZE]; 5 void fillTable(int x,int y,int step){ 6 /*其实step=2的情形也可以用下面的递归通式完成 7 if(step==2){ 8 table[x+1][y+1]=table[x][y]; 9 table[x][y+1]=table[x+1][y]; 10 return ; 11 }*/ 12 if(step==1)return; 13 14 step/=2;//把原问题分为四个表格的填写 15 fillTable(x,y,step);//填写左上子表格 16 fillTable(x+step,y,step);//填写左下的子表格 17 //右上的子表格抄写左下的子表格 18 //右下的子表格抄写左上的子表格 19 //注意坐标要使用相对坐标 20 for(int i=0;i<step;i++) 21 for(int j=0;j<step;j++){ 22 table[x+step+i][y+step+j]=table[x+i][y+j]; 23 table[x+i][y+step+j]=table[x+step+i][y+j]; 24 } 25 } 26 27 int main(){ 28 int n;cin>>n; 29 for(int i=1;i<=n;i++)table[i][1]=i; 30 fillTable(1,1,n); 31 for(int i=1;i<=n;i++){ 32 for(int j=1;j<=n;j++) 33 cout<<table[i][j]<<" "; 34 cout<<endl; 35 } 36 return 0; 37 }