如何在递归函数中返回某个布尔值?

时间:2014-12-12 19:29:35

标签: c++ recursion

我想创建一个递归函数来确定字符串的字符是否都包含字母表。我无法弄明白。这是我到目前为止所做的,但它没有正常工作。

bool isAlphabetic(string s){
const char *c = s.c_str();
if ((!isalpha(c[0]))||(!isalpha(c[s.size()])))
{
    return false;
}
else if (isalpha(c[0]))
{
    isAlphabetic(c+1);
    return true;
}
}

任何人都可以提出正确的方法吗?

3 个答案:

答案 0 :(得分:2)

不考虑你要创建的许多部分字符串(考虑只传入字符串和起始索引),isalpha(c[s.size()])检查将始终失败,因为{{1} {{1}在字符串的末尾。你也忽略了递归调用的结果。

\0

答案 1 :(得分:2)

Paul's answer上构建,这是一个不会复制字符串任何部分的固定实现。它通过传递对string对象的引用和要检查的字符的索引来实现此目的;递归只是将1添加到此索引以检查下一个字符,依此类推,直到找到字符串的末尾。

我已将您的号召移至c_str(),因为不需要。 string可以直接编入索引。

bool isAlphabetic(string const & s, int startIndex = 0) {
    // Terminating case: End of string reached. This means success.
    if (startIndex == s.size()) {
        return true;
    }

    // Failure case: Found a non-alphabetic character.
    if (!isalpha(s[startIndex])) {
        return false;
    }

    // Recursive case: This character is alphabetic, so check the rest of the string.
    return isAlphabetic(s, startIndex + 1);
}

请注意,此字符将空字符串视为字母。您可以将return true更改为return !s.empty()

来更改此设置

答案 2 :(得分:0)

这是一个工作示例:

#include <iostream>
#include <string>

using namespace std;

bool isAlphabetic(string s)
{
    if( s.empty() )
    {
        return false;
    }

    cout << "checking: " << s[0] << endl;

    if( isalpha(s[0]) )
    {
        return true;
    }

    return isAlphabetic(&s[0]+1);
}

int main()
{
    string word0 = "test";
    if( isAlphabetic(word0) )
    {
        cout << word0 << " is alphabetic" << endl; 
    }
    else
    {
        cout << word0 << " is NOT alphabetic" << endl; 
    }

    string word1 = "1234";
    if( isAlphabetic(word1) )
    {
        cout << word1 << " is alphabetic" << endl; 
    }
    else
    {
        cout << word1 << " is NOT alphabetic" << endl; 
    }

    string word2 = "1234w";
    if( isAlphabetic(word2) )
    {
        cout << word2 << " is alphabetic" << endl; 
    }
    else
    {
        cout << word2 << " is NOT alphabetic" << endl; 
    }

   return 0;
}