给定的字符串st进行递归计算,如果t中包含s,则返回true
  
  示例:bool find("Names Richard", "Richard") == true;


我已经在下面编写了代码,但是我不确定在C ++中使用递归是否正确。我今天在课堂上学习了递归。

#include <iostream>

using namespace std;

bool find(string s, string t)
{
    if (s.empty() || t.empty())
        return false;
    int find = static_cast<int>(s.find(t));
    if (find > 0)
        return true;
}

int main()
{
    bool b = find("Mississippi", "sip");
    string s;
    if (b == 1) s = "true";
    else
        s = "false";
    cout << s;
}


如果有人在我的代码中发现错误,请告诉我,以便我可以解决它或在哪里可以学习/阅读有关此主题的更多信息。我需要准备在这个星期三进行递归测试。

最佳答案

自从我写下答案以来,这个问题已经改变。

我的评论是关于看起来像这样的代码的(可能会递归)...

#include <iostream>

using namespace std;

bool find(string s, string t)
{
    if (s.empty() || t.empty())
        return false;
    string start = s.substr(0, 2);
    if (start == t && find(s.substr(3), t));
        return true;
}

int main()
{
    bool b = find("Mississippi", "sip");
    string s;
    if (b == 1) s = "true";
    else
        s = "false";
    cout << s;
}




当心这个:

if (start == t && find(s.substr(3), t));
    return true;


这并没有按照您的想法做。

;语句结尾的if留下一个空的正文。无论该测试的结果如何,您的find()函数都将返回true

我建议您在调试之前提高编译器的警告级别,以解决此类问题。

顺便说一句,我发现在每个代码块(甚至是一行代码块)周围都使用大括号可以帮助我避免这种错误。

您的代码中也存在其他错误。从2中删除​​魔术数字3find()会鼓励您思考它们代表的含义,并为您指明正确的道路。

您希望start == t && find(s.substr(3), t)如何工作?如果您可以用简单的英语(或您的母语)表达算法,则您有更大的机会可以用C ++表达它。

此外,我建议添加应返回false(例如find("satsuma", "onion"))的测试用例,以确保您的代码以及应返回true的调用均能正常工作。

最后一条建议是风格化的,这样布置您的代码将使您正在测试的布尔表达式更加明显,而无需求助于临时变量并与1进行比较:

int main()
{
    std::string s;
    if (find("Mississippi", "sip"))
    {
        s = "true";
    }
    else
    {
        s = "false";
    }
    std::cout << s << std::endl;
}


祝您上课好运!

关于c++ - 这是使用递归的正确方法吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8393749/

10-11 22:55
查看更多