1

私はこれらの問題のいくつかに出くわしましたが、それに対処する最善の方法を本当に知りませんでした. 再帰関数を作成して回答を作成しているときに、現在の回答が機能しないことがわかった場合、何を返せばよいでしょうか。

たとえば、答えが ArrayList であると想定されている場合、それが機能しないと言って false を返すことはできません。- null や -1 などのセンチネル値を返して、再帰呼び出しで確認する必要がありますか? - または、関数は void を返すだけで、答えがあると判断した場合にのみ、関数の外部の変数に追加する必要があります - または、値を保持する追加のパラメーターを保存し、それが機能しない場合は無視する必要があります (I'現在の例でこれを行う方法がわかりません)-または、最初に機能するかどうかを確認してからアクションを実行する関数を用意する必要があります

私が現在理解しようとしている問題は、文字列内のすべての順列を計算することに似ています。違いは、順列で連続する 2 つの文字を含む順列は、アルファベットで同じ順序で連続することはできないということです。たとえば、「bc」は使用できません。「cb」で大丈夫です。それが私の質問の良い例かどうかはわかりませんが、そうでない場合でも、バックトラック再帰を扱うのはいつも不快に感じるので、私の質問は依然として有効です。

4

2 に答える 2

1

はい、これに対する通常のアプローチは、定義済みの値 (-1 など、または関数の通常の操作では取得できない定数など) を返すことです。または、例外を発生させてから、再帰呼び出しでそれをキャプチャすることもできます。

于 2013-02-14T04:20:31.143 に答える
0

あなたの質問から、私はあなたが次のように振る舞うものを持っていると思います:

struct my_object *rec_foo(int param /* ... */)
{
    my_object *tmp = NULL;
    int x;
    /*
     * Do something
     */

    /*
     * Here you don't know how to handle
     * the case where rec_foo() fails
     */
    tmp = rec_foo(x /* ... */);
    /*
     * Other work
     */
    return tmp;
}

一般的なパターンの 1 つは、リターン ポインターを使用してエラー コードを運ぶことです。これは、-1 から -1000 までのすべての数値をエラーとしてポインターにキャストできる Linux カーネル内で行われます。独自のコードを定義して、返されたポインターを確認できます。

もう 1 つの方法は、エラーを含む列挙型の値を返し、関数が引数ポインターが指すデータを更新することです。したがって、関数のプロトタイプは次のようになります

enum rec_foo_error {
    REC_FOO_NO_ERROR,
    REC_FOO_ERROR_1,
    REF_FOO_ERROR_LAST /* Just to retrieve quickly
                      the number of available errors */
};
// You could simply use an int instead, but this is elegant
enum rec_foo_error rec_foo(struct my_object *obj, int x /*, ... */);
于 2013-02-14T10:21:20.893 に答える