使用静态变量的递归函数

问题描述 投票:2回答:2

因此,此函数似乎需要使用静态函数,我意识到的问题是,在递归函数结束之前无法重置静态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;
}
c++ function recursion static
2个回答
2
投票

否,无法重置本地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);
}

0
投票

如果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;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.