0

私はC++を初めて使用し、この関数を理解するのに苦労しています。誰かが私にそれを教えてもらえますか?

int seqSearch(int [ ] list, int target)
{
    //precondition:  The list is in non-decreasing order
    //postcondition:  The method returns -1 if the target is not in the list.  If the target
    //is in the list, the method returns the index of the first occurrence of the target.
    int result = -1;
    boolean foundBigger = false;
    int i = 0;
    while (result == -1 && !foundBigger && i < list.length)
    {
        if (target == list[i])
            result = i;
        else if (list[i] > target)
            foundBigger = true;
        //endif
        i++;
    }  //endwhile
    return result;
}
4

5 に答える 5

2

リスト内の番号が降順で格納されているターゲット番号がリストに存在するかどうかを検索しようとしています。

ループは続きます、

  1. ターゲットが見つからないまで。(Condition:result == -1)(ターゲットが見つかった場合、結果!= -1になり、ループが中断され、要素のインデックスが返されます。

  2. またはリスト内の要素がターゲットよりも大きくなるまで。(Condition:!foundBigger)(リストは降順であるため、ターゲットよりも小さい番号が見つかった場合、残りのリストでその番号を見つける可能性はありません。つまり、リストに存在しないことを意味します。リストとループは壊れているはずです。)

  3. またはリスト全体がレンダリングされ、見つからないまで。(条件:i <list.length)

今それが明確になることを願っています。

于 2013-02-19T02:59:19.823 に答える
1

うーん、「減少しない注文」。それのためのより良い言葉は昇順です:-)

この関数は、リストが昇順であることを前提としています。リストの最初のアイテム(list [0])から始めて、探しているアイテム(つまり、「ターゲット」)と比較します。等しい場合は、結果をインデックス「i」に設定します。そうでない場合は、iをインクリメントしてループを続行します。次のようになるまで、各アイテムを1つずつ確認します。

(a)「ターゲット」を見つける、または

(b)現在のアイテムが「ターゲット」よりも大きい(リストが注文されているため、ポイントが進まないため、この時点で終了します)

戻り値は、「ターゲット」が見つかったリスト内のインデックスであり、見つからなかった場合は-1です。

于 2013-02-19T02:56:57.557 に答える
0

結果が == -1 で、foundBigger が true で、関数に渡す配列のサイズが 0 より大きい場合

それから while ループの中に入る

上記の基準の 1 つでも完全に満たされていない場合は、ループ内に入らず、戻り値を返すだけです。

次に、ターゲットパラメーターを使用して関数に渡す値が配列リストのi値に等しい場合、結果をiの値に割り当てます

ターゲット値が配列リストの i 値より小さい場合、foundBigger に true が割り当てられるため、再び while ループに入ると、上記の基準を満たすことができません。

上記のいずれも機能しない場合、i は 1 ずつインクリメントされ、while ループから抜け出します。

ターゲット値が配列にない場合、ターゲット値が保存される位置が見つかるまで続き、結果は-1を返します

そうでなければ、場所を返します

于 2013-02-19T03:04:37.163 に答える
0
// precondition:  The list is in non-decreasing order
// postcondition:  The method returns -1 if the target is not in the list.  If the target
// is in the list, the method returns the index of the first occurrence of the target.
int seqSearch(int [ ] list, int target)
{
    int result = -1;                                    // Set result to 'not-found' value
    // Also we want to stop search if smth bigger than `target' will be found
    // Remember the original list is assumed to be sorted, so first value
    // bigger than `target' means: no need to continue, it is guarantied that `target'
    // is nto here!
    boolean foundBigger = false;
    int i = 0;                                          // Initial index to start search
    // Repeat 'till `target' not found AND not found smth bigger that requested target
    // and current index less than the list size...
    while (result == -1 && !foundBigger && i < list.length)
    {
        if (target == list[i])                          // Is current item equal to the requested?
            result = i;                                 // Remember result index (this will break the loop)
        else if (list[i] > target)                      // Is current item bigger than the requsted?
            foundBigger = true;                         // Yep, will break the loop w/ no result to return
        //endif
        i++;                                            // move to next item in the list
    }  //endwhile
    return result;                                      // Return the result,  whatever it is
}
于 2013-02-19T03:04:54.900 に答える
0

これが機能するコードである場合、C++ ではありません。while ループ内のブール演算は、演算の順序のために個別の括弧で囲む必要があり、c++ には配列の .length プロパティがありません (Java ではこれらの両方が許可されているため、Java で記述されているようになります)。ロジック後ろは相変わらずだけど。

最初に、結果の int (返されるもの) と、必要な要素を渡したかどうかを確認するブール値を初期化します。探しているものが見つからず、目標の項目を「通過」していない限り、続行します。

ターゲットが見つかった場合、結果の int は正しいインデックスに変更され、次にループが条件をチェックするときに、インデックスは -1 を超えて実数を表すため、メソッドは終了してインデックスを返します。

2 番目のステートメントは、探している int が渡されたかどうかを確認します。リストが連続していることはわかっているので、現在の値が探している値よりも高く、アイテムが見つからなかった場合は、次に条件がチェックされたときにループを終了するように foundBigger ブール値を変更します。 .

これらの条件のいずれも満たされない場合、最終的にはリストの最後を超えて検索されるため、リストの最後に到達すると、アイテムがリストにないことがわかり、引き続き -1 が返されます。

于 2013-02-19T03:06:47.880 に答える