0

私の知識は限られており、C++ で 2 か月間書いています

この関数では、基本ケースが見つかるstring codeまで再帰的に文字を減らします。""ベース ケースが見つかる前にいくつかstring codeのパスを削除したいのですが、ベース ケースへのパスが見つからないパスもあります。プルーンの場合、パス内の属性をパラメーターと比較したいと思いますint time。これは、「nodeT」で作成されたトライを検索します

struct charT {
char letter;
nodeT *next;
};

struct nodeT {
bool isOperation;
bool isCode; 
int time;
Vector<charT> alpha;
};

nodeT *root

usage:
string code = "12345";
int time = convertToEpoch(20120815); //my epoch function
containsCode(code, time)

bool containsCode(string code, int time)
{
    if(root == NULL) return false;
    else return containsCodeHelper(root, code, time);
}


bool containsCodeHelper(nodeT *w, string code, int time)
{
    if(code == "") //base case: all char found
        return w->isCode; 
    else {
        if (w->isOperation && w->time != time) return false; //case 2: time check OK <- at a midpoint in the path
        for(int i = 0; i < w->alpha.size(); i++) { //Loop through the leaf
            if (w->alpha[i].letter == code[0]) //case 3: leaf exists
                return containsCodeHelper(w->alpha[i].next, code.substr(1), time);
        }
    }
    return false; //if no path
}

この関数は、時間チェック prune を追加する前はうまく機能していました。時間外の場合はループしますが、 char 位置 0 からreturns falseの候補で再び開始します。string code

質問: 1) 再帰を次の for ループの呼び出しに戻す入れ子になったキックですか? 2) 論理または「パス」return falseを使用して for ループに時間プルーニングを配置する必要がありますか? C++ の概念を学ぶ <- はいの場合は説明してください。return falsereturn

また、投稿された関数は、実際の関数の簡略化されたバージョンです。時間への修飾子と、省略した「ステップ オーバー」パスがあります。過去の質問で、これらの「アドオン」が質問から気をそらすことがわかりました。

4

1 に答える 1

0

いくつかのやり直しの後、正常に機能するようになりました-おそらく常に機能していました。属性return w->isCodeをに読み取るreturn trueように変更しました。これが最大の問題のようです。トライ コンストラクターをデバッグし、各パスの最後に属性が設定されているかどうかを確認します。

boolcontainsCodeHelper(nodeT *w, string code, int time) 
{
    if(code == "") //base case: all char found
        return true;
    else {
        if ( w->isOperation && (!((w->begin-wag) <= time && time <= (w->end+wag) ) && time != 9999 ) ) 
            return false; //case 2: time
        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 containsCodeHelper(w->alpha[i].next, word.substr(1), time, wag);
                else if (word[0] == 'ž') //step over '0' all subnodes
                    if (containsCodeHelper(w->alpha[i].next, word.substr(1), time, wag)) 
                        return true;
            }
        }
    }
    return false; //if char is missing - meaning the exact code is not there - terminates garbage subnode paths
}

最後に持っていることとそれを除外することに違いはありませんreturn false;また、別のスタックオーバーフロースレッドの助けを借りて、試行錯誤を通じてその解決策を見つけたif( bool fn()) return true;だけでなく、特別なケースが必要な理由についてもまだ混乱していますreturn ( bool fn());

于 2012-08-15T20:48:08.460 に答える