索引的递归

时间:2014-11-08 18:39:08

标签: c++ recursion indexing

Hello其他程序员,我有一个关于递归的问题,我不理解,是C ++的新手。因此,对于本练习我正在完成,我需要:1。向用户询问字符串2.要求用户输入字符串以在输入的第一个字符串中进行搜索。 3.如果找到字符串,则报告和索引。例如,用户输入字符串“Search me”,要搜索的字符串是“me”,索引将返回“7”。我现在正在举起手来寻求如何完成它的任何帮助,任何帮助将不胜感激。到目前为止,这是我的代码。 for循环中的东西不是一个完整的想法,只是FYI。

int index_of(string stringToSearchIn, string stringToSearchFor, int index)
{

if (stringToSearchIn.length() < stringToSearchFor.length())
{
    cout << "Your string cannot be found." << endl;
    system("PAUSE");
    return OUTLIER;
}
else
{
    bool found = true;
    for (int i = ZERO; i < stringToSearchFor.length; i++)
    {
        found = found && stringToSearchIn(i) == stringToSearchFor(i);
    }
    return index;
}

return index_of(stringToSearchIn.substr(INCREASE), stringToSearchFor, index++);
}

int main()
{
//Initializing values
string userString;
string userSearch;
int userIndex = 0;

//Asking for user input for string
cout << "This program will find the occurence of one string inside of another." << endl;
cout << "Enter the string to be searched: " << userString;
//Getting the string
getline(cin, userString);

//Asking for user input for search input
cout << "Now enter the string you want to search for: " << userSearch;
//Getting the string
getline(cin, userSearch);

//Displaying results
cout << "The index of the substring is = " << index_of(userString, userSearch, userIndex);

//Keeping console window open until key press
system("PAUSE");
return ZERO;
}

1 个答案:

答案 0 :(得分:0)

捕捉:)

#include <iostream>

size_t index_of( const char *s, const char *t )
{
    const char *p = s;
    const char *q = t;

    while ( *q && *p == *q ) ++p, ++q;

    if ( *q == '\0' )
    {
        return 0;
    }
    else if ( *p == '\0' )
    {
        return -1;
    }
    else
    {
        size_t n = 1 + index_of( s + 1, t );
        return n == 0 ? -1 : n;
    }
}

int main() 
{
    const char *s = "Search me";
    const char *t = "me";

    size_t n = index_of( s, t );

    if ( n != -1 )
    {
        std::cout << "string " << t << " is found at position " << n << std::endl;
    }
    else
    {
        std::cout << "string " << t << " is not found" << std::endl;
    }

    return 0;
}

输出

string me is found at position 7

对于其他字符串,我没有测试该函数。:)

对于std::string类型的对象,您可以将其称为

size_t n = index_of( s.c_str(), t.c_str() );

否则,如果你想为类型为std :: string的对象编写一个类似的递归函数,那么你需要添加一个静态局部变量来保持当前位置在源字符串中,或​​者为索引或使用添加一个参数成员函数substr。

另外我的建议是不要将清单常量ZERO用于零。在我看来,这是一种糟糕的编程风格。它只会让读者感到困惑,因为ZERO可以包含一些用户定义的类。

例如(未经测试)

#include <iostream>
#include <string>

std::string::size_type index_of( const std::string &s, const std::string &t )
{
    static std::string::size_type pos;

    if ( s.size() < t.size() ) return std::string::npos;

    if ( s.compare( pos, t.size(), t ) == 0 ) return 0;

    ++pos;

    std::string::size_type n = index_of( s, t );

    --pos;

    return n == std::string::npos ? std::string::npos : n + 1;
}


int main() 
{
    std::string s = "Search me";
    std::string t = "me";

    std::string::size_type n = index_of( s, t );

    if ( n != std::string::npos )
    {
        std::cout << "string " << t << " is found at position " << n << std::endl;
    }
    else
    {
        std::cout << "string " << t << " is not found" << std::endl;
    }


    return 0;
}

至于你的功能实现,那么它可以查看以下方式

#include <iostream>
#include <string>

std::string::size_type index_of( const std::string &stringToSearchIn, 
                                 const std::string &stringToSearchFor, 
                                 std::string::size_type index )
{
    if ( stringToSearchIn.length() < stringToSearchFor.length() + index )
    {
        return std::string::npos;
    }
    else if ( stringToSearchIn.compare( index, 
                                        stringToSearchFor.length(),
                                        stringToSearchFor ) == 0 )
    {
        return index;
    }
    else
    {
        std::string::size_type n = 
            index_of( stringToSearchIn, stringToSearchFor, ++index );
        return n == std::string::npos ? std::string::npos : n;
    }
}

int main() 
{
    std::string s = "Search me";
    std::string t = "me";

    std::string::size_type n = index_of( s, t, 0 );

    if ( n != std::string::npos )
    {
        std::cout << "string " << t << " is found at position " << n << std::endl;
    }
    else
    {
        std::cout << "string " << t << " is not found" << std::endl;
    }

    return 0;
}