因此,此函数似乎需要使用静态函数,我意识到的问题是,在递归函数结束之前无法重置静态var。有没有办法做到我所不知道的,还是有一个好办法不用静态var来做到这一点。
此函数的目标是先用奇数var填充数组,所以说您将其称为fillAryOddFirst(ary,13),然后将按以下顺序填充数组[13、11、9、7、5、3、1、2、4、6、8、12]
void fillAryOddFirst(int ary[], int size) {
static int pos;
if (size <= 0) {
return;
}
if(size % 2 != 0){
ary[pos] = size;
pos++;
}
fillAryOddFirst(ary, size-1);
if(size % 2 == 0 ){
ary[pos] = size;
pos++;
}
return;
}
否,无法重置本地static
变量。
如果您希望能够将其重置,则唯一的选择是将其设置为全局变量,即将其声明移到函数外部。
另一种可能性是使其成为您通过引用传递的参数:
void fillAryOddFirst(int ary[], int size, int &pos)
{
if (size <= 0)
{
return;
}
if (size % 2 != 0)
{
ary[pos] = size;
pos++;
}
fillAryOddFirst(ary, size - 1, pos);
if(size % 2 == 0 )
{
ary[pos] = size;
pos++;
}
}
void fillAryOddFirst(int ary[], int size)
{
int pos = 0;
fillAryOddFirst(ary, size, pos);
}
如果size
为奇数,则写入第一个元素。如果是偶数,则写入最后一个元素。无论哪种情况,都递归地“关注”其余的子数组:
void fillAryOddFirst(int ary[], int size) {
if(size > 0) {
if(size % 2 == 1) {
// +---+---|...|---+
// | s | ? |???| ? |
// +---+---|...|---+
// ^ ary ^ ary + size
// ^ ary + 1 ^ (ary + 1) + (size - 1)
// \-----------/ focus on this range
ary[0] = size;
fillAryOddFirst(ary + 1, size - 1);
} else /*if(size % 2 == 0)*/ {
// +---|...|---+---+
// | ? |???| ? | s |
// +---|...|---+---+
// ^ ary ^ ary + size
// | ^ ary + (size - 1)
// \-----------/ focus on this range
ary[size - 1] = size;
fillAryOddFirst(ary, size - 1);
}
}
}
写为循环,应该是
void fillAryOddFirst(int ary[], int size) {
for(; size > 0; size--) {
if(size % 2 == 1) *ary++ = size;
else ary[size - 1] = size;
}
}