i++与++i
1.temp=i++,那么先temp=i,再i=i+1,最后temp和i相差1;
2. temp=++i,那么先i=i+1,再temp=i,最后temp和i相等;
函数参数值传递
函数参数是值传递的时候,只是将实际参数的值赋值给形式参数,函数体内的操作也只会影响形式参数。
下面是用分治法解决的问题—数字旋转方阵方阵
解决办法–分治–一次解决一圈,一圈分为四边,然后递归
重点是我太憨了😭cnt记录已经解决了几圈,递归调用时,下一次就应该cnt+1,我用的cnt++,值传递,所以一直在死循环输入最外圈,最后stack overflow了😭我还一直没发现……
int arr[10][10] = { 0 };
void Function(int cnt, int n, int m)
{
//n为奇数时最后一圈只是一个在中心的数
if (cnt * 2 - 1 == n) {
arr[cnt - 1][cnt - 1] = m;
return;
}
//n为偶数时,在上次递归就已经结束了
if (cnt * 2 - 2 == n) return;
int i, j;
j = cnt - 1;
//以下一圈的四边
//左,列不变,行变
for (i = cnt - 1; i < n - cnt; m++, i++)
arr[i][j] = m;
//下,行不变,列变
for (; j < n - cnt; j++, m++)
arr[i][j] = m;
//右,列不变,行变
for (; i > cnt - 1; m++, i--)
arr[i][j] = m;
//上,行不变,列变
for (; j > cnt - 1; m++, j--)
arr[i][j] = m;
//继续下一圈,此处应该是++cnt,不能是cnt++
//如果是cnt++,那么下一次调用是,只是将cnt++的值赋值给了形参cnt
//那么下次,cnt还是那一圈,相当于一直更改那一圈的值😥
Function(++cnt, n, m);
return;
}
int main()
{
int n;
cin >> n;
Function(1, n, 1);
int i, j;
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++)
cout <<setw(6)<<arr[i][j] << " ";
cout << endl;
}
return 0;
}
如果这样:
Function(++cnt, n, m);
那么就会……
啊气死我了
所以……要是需要传递更改以后的值,一定要注意是++i啊
是我太菜了……