【问题标题】:C++ - Return in Recursion of TreeC++ - 在树的递归中返回
【发布时间】:2020-04-04 21:42:59
【问题描述】:
class Person {
private:
    char* name;
    int numChildren;
    Person** childrenList;
public:
    Person(char* name);
    ~Person();
    // member functions
        // ...
};

假设我通过这段代码创建了一个PersonPerson* me = new Person("Alex");Alex 的后代对象也将被创建。对于特定的实例,结构将是这样的:

我想实现一个函数const Person* Person::findPerson(const Person* thisPerson, const char* target_name) const;,它搜索所有Person以找到name等于target_name的那个。
这是我的代码:

const Person* Person::findPerson(const Person* thisPerson, const char* target_name) const {
    if (strcmp(thisPerson->name(), target_name) == 0)
        return thisPerson;
    for (int i = 0; i < thisPerson->numChildren(); i++)
        findPerson(thisPerson->childrenList[i], target_name);
}

我认为代码可以工作,但编译器认为它可能什么也不返回,不让我编译它。而且,如果找不到人,我不知道如何返回nullptr

【问题讨论】:

  • 在第二个循环中,if (findPerson(...)) return findPerson(....)。如果找不到,您还需要return nullptr
  • @JohnnyMopp 您的意思是添加循环还是修改现有循环?
  • 递归最重要的一点是递归函数的工作方式与非递归函数完全一样。如果你调用了findPerson以外的任何其他函数,函数会返回什么?
  • 如果if 语句为假,你认为这个函数会返回什么?

标签: c++ class recursion


【解决方案1】:

你需要:

  1. return递归调用的结果,如果成功的话
  2. return nullptr 如果找不到此人
const Person* Person::findPerson(const Person* thisPerson, const char* target_name) const {
    if (strcmp(thisPerson->name(), target_name) == 0)
        return thisPerson;
    for (int i = 0; i < thisPerson->numChildren(); i++) {
        const Person *p = findPerson(thisPerson->childrenList[i], target_name);
        // Found in child tree? Return it (terminate recursion)
        if (p) return p;
    }
    // Not found in this branch of the tree
    return nullptr;
}

虽然将Person 指针传递给Person 成员函数似乎有点奇怪。另外,numChildrenname 是成员变量,而不是函数。

不应该是:

const Person* Person::findPerson(const char* target_name) const {
    if (strcmp(name, target_name) == 0)
        return this;
    for (int i = 0; i < numChildren; i++) {
        const Person *p = childrenList[i]->findPerson(target_name);
        // Found in child tree? Return it (terminate recursion)
        if (p) return p;
    }
    // Not found in this branch of the tree
    return nullptr;
}

而且,我不得不问你为什么不使用 std::vectorstd::string 而不是数组和字符指针?

【讨论】:

  • 但我想我需要一个参数,以便我可以使this 指向Person 而不是Alex?如果没有Person*参数,会不会一直指向第一个?
  • 由于使用动态对象的原因,这个问题是从作业中的一个问题简化而来的,我不允许修改类定义。
  • 您很可能有一个位于树顶部的根 Person 对象。你可以在上面调用这个函数:root.findPerson("blah");。此外,如果您有任何 Person 类的实例,您可以在其上调用该函数。例如,假设 john 是树中某处的 Person 对象。您可以使用 john.findPerson("blah"); 仅搜索 john 的后代
  • 注意:我刚刚修复的第二个代码块有一个错误。
  • nvm 我明白了。非常感谢!
猜你喜欢
  • 2012-08-10
  • 2018-12-31
  • 2013-12-12
  • 2021-03-14
  • 2023-03-14
  • 2014-04-17
  • 1970-01-01
  • 1970-01-01
  • 2018-07-15
相关资源
最近更新 更多