递归调用时不是应该为局部变量分配新空间吗?为什么enumerate函数每次递归,temp传入node->array的地址都一样?
C语言学习中,许多不懂的请高手指点,谢谢!
C语言学习中,许多不懂的请高手指点,谢谢!
void enumerate(Node *node,int *data,int x,int y,int row,int column,int MaxDeep,int MinDeep,int MaxWidth,int rest) { int i,j; int temp[row][column]; int rotationData[row][column], udsymData[row][column],rotation90[row][column], rotation180[row][column], rotation270[row][column]; int temp1[row][column],temp2[row][column],temp3[row][column],temp4[row][column],temp5[row][column]; if((x<0)||(y<0)||(x>=row)||(y>=column)) return; for(i=0;i<row;i++) { for(j=0;j<column;j++) temp[i][j] = data[i*column + j]; } if(temp[x][y] == 1) return; temp[x][y] =1; rest = rest-1; if((row-x) >= MaxDeep) MaxDeep = row -x; if((row-x-1)<=MinDeep) MinDeep = row -x-1; if(y <= MaxWidth) MaxWidth = y; if(rest<=0) { if((MinDeep == 0) && (MaxDeep == row) &&(MaxWidth==0)) { if(row != column) { Rotation180(&temp[0][0],&rotationData[0][0],row,column); UDSym(&temp[0][0],&udsymData[0][0],row,column); if(InSqureArray(node,&temp[0][0],row,column)) return; if(InSqureArray(node,&rotationData[0][0],row,column)) return; if(InSqureArray(node,&udsymData[0][0],row,column)) return; node->array[node->count] = &temp[0][0]; printf("node->array[%d] =%p \n",node->count,node->array[node->count]); node->count = node->count +1; printf("print array\n"); for(i=0;i<row;i++) { for(j=0;j<column;j++) printf("%d",temp[i][j]); printf("\n"); } printf("\n"); } else if(row == column) { Rotation90(&temp[0][0],&rotation90[0][0],row,column); Rotation180(&temp[0][0],&rotation180[0][0],row,column); Rotation90(&rotation180[0][0],&rotation270[0][0],row,column); UDSym(&temp[0][0],&udsymData[0][0],row,column); if(InSqureArray(node,&temp[0][0],row,column)) return; if(InSqureArray(node,&rotation90[0][0],row,column)) return; if(InSqureArray(node,&rotation180[0][0],row,column)) return; if(InSqureArray(node,&rotation270[0][0],row,column)) return; if(InSqureArray(node,&udsymData[0][0],row,column)) return; node->array[node->count] = &temp[0][0]; printf("node->array[%d] =%p \n",node->count,node->array[node->count]); node->count = node->count +1; printf("print array\n"); for(i=0;i<row;i++) { for(j=0;j<column;j++) printf("%d",temp[i][j]); printf("\n"); } printf("\n"); } } return; } for(i=0;i<row;i++) { for(j=0;j<column;j++) { temp1[i][j]=temp[i][j]; temp2[i][j]=temp[i][j]; temp3[i][j]=temp[i][j]; temp4[i][j]=temp[i][j]; temp5[i][j]=temp[i][j]; } } enumerate(node,&temp1[0][0],x-1,y-1,row,column,MaxDeep,MinDeep,MaxWidth,rest); enumerate(node,&temp2[0][0],x,y-1,row,column,MaxDeep,MinDeep,MaxWidth,rest); enumerate(node,&temp3[0][0],x+1,y-1,row,column,MaxDeep,MinDeep,MaxWidth,rest); enumerate(node,&temp4[0][0],x-1,y,row,column,MaxDeep,MinDeep,MaxWidth,rest); enumerate(node,&temp5[0][0],x+1,y,row,column,MaxDeep,MinDeep,MaxWidth,rest); } void exec(int row,int column,int n) { int data[row][column]; int i,j,k; Node node; Node *p=&node; int num; for(i=0;i<row;i++) { for(j=0;j<column;j++) { data[i][j]=0; } } node.row=row; node.coloumn=column; node.count=0; node.array[MaxNum]= NULL; //枚举 for(i=0;i<row;i++) { enumerate(p,&data[0][0],i,column-1,row,column,0,5,5,n); } printf("node->array[0] =%p \n",node.array[0]); sum = sum + node.count; }
解决方案
15
为什么不一样?函数调用的参数传递本质上是值传递
只有引用参数,才是地址传递
每次复制一份node
node 的值当然不会变化了
只有引用参数,才是地址传递
每次复制一份node
node 的值当然不会变化了
30
参数是一级指针,只能改变指针指向的区域的值(实参和形参都指向同一块内存,但两个指针本身是不同的)
只有传二级指针或一级指针的引用才能改变指针本身的值(指针的指向)
只有传二级指针或一级指针的引用才能改变指针本身的值(指针的指向)
10
“给定一个小点的输入,完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门!
递归函数关注以下几个因素
·退出条件
·参数有哪些
·返回值是什么
·局部变量有哪些
·全局变量有哪些
·何时输出
·会不会导致堆栈溢出
递归函数关注以下几个因素
·退出条件
·参数有哪些
·返回值是什么
·局部变量有哪些
·全局变量有哪些
·何时输出
·会不会导致堆栈溢出