1

私は自分でオライリーの教科書から問題セットを完成させていますが、このプログラムで何をすべきかについて少し混乱しています。count(number, array, length)問題は: number が に現れる回数を数える関数を書きなさいarray. 配列にはlength要素があります。関数は再帰的でなければなりません。関数に合わせてテスト プログラムを作成します。

質問は逐語的にコピーされますが、この質問についていくつか質問があります。次の点についてご意見をお寄せいただければ幸いです。

  1. arrayでは、 with lengthが必要lengthです。自分の数値をスロットに保存しますか? または、ランダムな整数を生成してスロットに入れますか?
  2. また、適切な計画がありますか? 私の計画は次のとおりです。

配列を作成しcount、メインで呼び出します。関数countは、それが見つかるまで配列を通過する if ループになり、numberその後カウンターに 1 を追加します。次に、count関数はパラメーターを使用してそれ自体を呼び出しますcount(int number; int array; int (length - 1))

それについて自分自身に話そうとする今、私はさらに混乱しています。質問を難しくしているだけかもしれません。どんなヒントでも役に立ちます。ありがとう

4

2 に答える 2

2

コード スニペットは、多くの言葉よりも価値があると思います。だから私はそのようなものに行きます:

#include <iostream>

int count(int num, int* arr, int length) {
    if (!length)
        return 0;
    int c = count(num, arr+1, length-1);
    return arr[0] == num? c + 1: c;
}

int main(void) {
    int arr[10] = {1, 2, 3, 4, 3, 2, 1, 4, 3, 2};

    std::cout << count(2, arr, 10);

    return 0;
}

出力:

3
于 2013-05-29T23:25:46.960 に答える
0
  1. 関数が正しいかどうかをテストするには、配列で独自の数値を使用できます。アルゴリズムが機能することだけが重要です。
  2. いいえ、あなたのアプローチは間違っています。再帰には 2 つの部分があります。

a) あなたが知っていることについての節

b) 持っているものを変えれば、何を知ることができるかについての条項。

したがって、あなたの場合、関数count(.....)は最初に が 0 であるかどうかを知る必要がlengthあります。これは、 の回数numberが 0 回であるためarrayです。そうでない場合はcount(.....)number配列arrayの最後の要素とlength-1. これにより、配列に項目がなくなるまで、配列が再帰的にシャベルで処理されます。

~脳をリフレッシュさせる小休憩~

関数の戻り値を変数に保存し、その後、 の最後の項目が の場合は 1 を追加しarraynumberそうでない場合は追加する必要があります。そして再びその値を返します。この値は、すべての関数呼び出しを通じて逆方向に渡され、確認している配列要素がnumber. への元の呼び出しは、内の の数を返しcount(....)ますnumberarray

私の説明に間違いがないことを願っています。

于 2013-05-29T23:32:31.493 に答える