2017-01-19 3 views
0

だから私は "1"を返すだけの再帰関数を書こうとしています。私の関数の中で、私はそれが同じIDを持っている場合はCHAPへのポインタを見つけて返すようにしたい今ポインタまたはNULLを1回だけ返すCの再帰関数

typedef struct CHAP CHAP; 

struct CHAP{ 

int ID; 
CHAP** list; 
int nb; 

}; 

:だから私は何をしようとしていますが、最初に私は単純な再帰構造を定義しているされて

私の目標。これまで私はこれを持っています:

CHAP* find_chap(CHAP* ch, CHAP* target){ 

    if (ch->ID == target->ID) return ch; 

    for (int i=0; i<ch->nb; i++){ 
     find_chap(ch->list[i], target); 
    } 
    //return NULL? 
} 

しかし、もしエントリが見つからなければ何かを返す方法がわかりませんか?だからその場合はNULLを返すが、どこに配置するかはわからない。 IDがいくつかのエントリに含まれている場合、最初に見つかったポインタだけが返されます。あなたがから値を返すのを忘れて/

+3

'find_chap'への再帰呼び出しが何を返すのか確認してください。 –

+0

エントリiksが見つからなければ 'NULL'を返します。ここで再帰は必要ありません。 –

+0

あなたは 'return find_chap(...);'を使用しなければなりません – linuxfan

答えて

1

以下を行う必要があります。現在のパラメータchは、あなたの目標と一致するかどうかを

  • 録音
  • 子ノードをch子ノードにループして、リストを返す(既にあるかもしれない)か、リストを使い果たすまでマッチさせます。
  • 上記の結果を返します。要するに

、このような何か:

CHAP* find_chap(CHAP* ch, CHAP* target) 
{ 
    CHAP *res = (ch->ID == target->ID) ? ch : NULL; 

    for (int i=0; !res && i<ch->nb; ++i) 
     res = find_chap(ch->list[i], target); 

    return res; 
} 

まだ子供を再帰ながら、機能に単一returnのポイントを持っていることのあなたの要件を満たす必要があります。

+0

ループ内の '!res'が立っています。私は前にこの記法を見てきましたが、私はどこでも説明を見つけることができませんでした。私は、resがポインタであり、boolまたは整数値ではないので混乱しています。 – malajedala

+0

@malajedalaこれは、 'res'がまだNULLかどうかのテストです。 '(res == NULL)'と等価です。ループは、(a) 'res'がNULLでないか、または(b)' i'が 'ch-> nb'を満たしたときに直ちに中断します。 'ch-> ID == target-> ID'のために' res'がすでに最初の行で非NULLに設定されていると、ループは効果的にnoopになり、反復は行われません。 '!res'は* false *となり、for-conditionはもはや満たすことができません。 – WhozCraig

+0

ありがとうございます。私はあなたの例を試しました、そして、まさに私がやろうとしていたものです。あなたの助けと説明に感謝します! – malajedala

1

私はそれがコメントアウトされている行でそれを行う場合は、機能と再帰呼び出しは、私が欲しいものではありませんこれは、エントリが発見された後も継続されます再帰呼び出し:

CHAP* find_chap(CHAP* ch, CHAP* target){ 

    if (ch->ID == target->ID) return ch; 

    for (int i=0; i<ch->nb; i++){ 
     CHAP * c = find_chap(ch->list[i], target); 
     if (c != NULL) return c;   // return not null value if one was found 
    } 
    return NULL; // not found here... 
} 
関連する問題