簡體   English   中英

C++ - 在樹的遞歸中返回

[英]C++ - Return in Recursion of Tree

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

你需要:

  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而不是數組和 char 指針?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM