Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何为递归函数使用索引变量?_C++_Recursion - Fatal编程技术网

C++ 如何为递归函数使用索引变量?

C++ 如何为递归函数使用索引变量?,c++,recursion,C++,Recursion,如何为递归函数使用索引变量,该函数每次调用时都会递增,这样它就可以返回一个值,而无需将其作为参数传递,或者使用静态或全局变量,因为我希望不止一次调用此函数 这是我的密码: bool isAlphabetic(string s) { static int i = 0; if (i==s.size()) { return true; } else if (!isalpha(s[i])){ return false; }

如何为递归函数使用索引变量,该函数每次调用时都会递增,这样它就可以返回一个值,而无需将其作为参数传递,或者使用静态或全局变量,因为我希望不止一次调用此函数

这是我的密码:

bool isAlphabetic(string s)
{
    static int i = 0;
    if (i==s.size())
    {
        return true;
    }
    else if (!isalpha(s[i])){
        return false;
    }
    i++;
    return isAlphabetic(s);
}

有人知道如何解决这个问题吗?我知道我使用的是一个静态变量,但这会使函数在第一次调用时正确运行,但不会在调用之后正确运行。

值得注意的是,由于堆栈溢出,递归可能会因较大字符串而失败

bool isAlphabetic(const string & s, int pos){
    if(i==s.size()) return true;
    else if(!isalpha(s[pos])) return false;
    return isAlphabetic(s, ++pos);
}

bool isAlphabetic(const string & s){
    return isAlphabetic(s, 0);
}

值得注意的是,由于堆栈溢出,较大字符串的递归可能会失败

bool isAlphabetic(const string & s, int pos){
    if(i==s.size()) return true;
    else if(!isalpha(s[pos])) return false;
    return isAlphabetic(s, ++pos);
}

bool isAlphabetic(const string & s){
    return isAlphabetic(s, 0);
}

@我不想把它当作一个论点。除了传递一个参数,还有什么方法可以做到这一点吗?你希望如何保存状态信息而不将其作为传入参数或其他变量存储在某个地方?你看到的行为是什么?它与你期望的有什么不同?这是一个实验室作业,我必须这样做如果不将“i”作为参数传递,则不希望传递位置,但每次调用时都使用字符串副本。这太糟糕了,即使字符串缓冲区每次都没有得到副本。@2501我不想把它作为参数传递。除了传递一个参数,还有什么方法可以做到这一点吗?你希望如何保存状态信息而不将其作为传入参数或其他变量存储在某个地方?你看到的行为是什么?它与你期望的有什么不同?这是一个实验室作业,我必须这样做如果不将“i”作为参数传递,则不希望传递位置,但每次调用时都使用字符串副本。这是最糟糕的,即使字符串缓冲区每次都没有得到副本。智能编译器可以防止堆栈溢出,因为此算法是尾部递归的。不一定是在调试模式下!:)至少您使用了对字符串的引用,从而减轻了可怕的复制。智能编译器可以防止堆栈溢出,因为此算法是尾部递归的。不一定是在调试模式下!:)至少您使用了对字符串的引用,这减轻了可怕的复制。