使用节点步骤编写解析递归函数

时间:2012-08-08 21:05:05

标签: c++ visual-studio-2008 recursion trie

目的:此函数在与输入字符串匹配的路径之后解析字符串trie。解析字符串中的所有字符时,将返回true。我想跳过一个char并返回,如果仍然有一个有效的路径。

应用程序:字符串是高速公路项目的位置层次结构。因此,项目5具有对齐C,其具有N的偏移和工作区3; 5CN3。但是,有时我想为涵盖所有位置的项目任务的所有子位置定义一个字符串。所以,'0'是所有位置;对于半天的操作,如等级的污垢没有工作区 - 所有这样代表这个任务都是北方路线C中的所有工作区; 5CN0。如果一项行动涵盖整个项目,则相同; 5000。

方法:我本可以使用通配符'?'功能,但我想保留这个特定的步骤,以抽象位置。也许 '?'是正确的方法,但似乎放松了一些控制。此外,这可以在没有for循环的情况下编写并使用位置索引参数;也许这就是出错的地方 - 也许是回溯。

代码:nodeT是trie节点,word是输入字符串,此函数是bool,如果字符串路径存在,则返回1/0。

bool Lexicon::containsWordHelper(nodeT *w, string word)) //check if prefix can be combined
{
    if(word == "") { //base case: all char found
        return true;
    } else {
        for(int i = 0; i < w->alpha.size(); i++) { //Loop through all of the children of the current node
            if (w->alpha[i].letter == word[0])
                return containsWordHelper(w->alpha[i].next, word.substr(1));
            else if (word[0] == '0') //if '0' then step over and continue searching for valid path
                containsWordHelper(w->alpha[i].next, word.substr(1)); //removed return here to allow looping through all the possible paths
        } //I think it is continuing through after the loop and triggering return false
    }
    return false; //if char is missing - meaning the exact code is not there
}

问题是当使用'0'通配符时返回false。这里出了什么问题?我的知识有限。

我讨论了这个问题一段时间并使用了'howboutthis howboutthat'方法,并发现将return放在步骤结束时就可以了。

bool Lexicon::containsWordHelper(nodeT *w, string word, int &time, int &wag, string compare) //check if prefix can be combined
{
    if(word == "") { //base case: all letters found
        if ((w->begin-wag) <= time && time <= (w->end+wag)) 
            return w->isWord; // case 2: timecard check for high/low date range
        else if (time == ConvertDateToEpoch(9999, 01, 01)) return w->isWord; //this is for single code lookup w/o date
    } else {
        for(int i = 0; i < w->alpha.size(); i++) { //Loop through all of the children of the current node
            if (w->alpha[i].letter == word[0])
                return containsWordHelper(w->alpha[i].next, word.substr(1), time, wag, compare);
            else if (word[0] == 'ž')
                if (containsWordHelper(w->alpha[i].next, word.substr(1), time, wag, compare)) return true;
        }
    }
    return false; //if char is missing - meaning the exact code is not there
}

似乎合乎逻辑的是,如果我只有一个以true结尾的路径返回,那么我应该在递归完成后放置返回,然后有条件地仅在返回时返回true。回想起来,这看起来很合理,但我对此的信心充其量是粗略的。

我仍然有同样的问题。出了什么问题?

2 个答案:

答案 0 :(得分:0)

您可以测试后一个containsWordHelper调用的结果,如果结果为true则返回true,否则继续迭代。

答案 1 :(得分:0)

解决:在包含递归调用的if语句后放置一个返回值

bool Lexicon::containsWordHelper(nodeT *w, string word) 
    {
        if(word == "") return w->isWord;
        else {
            for(int i = 0; i < w->alpha.size(); i++) {
                if (w->alpha[i].letter == word[0])
                    return containsWordHelper(w->alpha[i].next, word.substr(1));
                else if (word[0] == 'ž')
                    if (containsWordHelper(w->alpha[i].next, word.substr(1))) return true;
            }
        }
        return false;
    }