4

C++ の本で、「配列に数値が出現する回数をカウントする関数を作成する」という練習問題を見つけました。すべて問題ありません。プログラムは動作しています。しかし、演習では、関数は再帰的であるべきだとも言っています。

このように機能する再帰関数を作成するにはどうすればよいですか?

#include <iostream>

int count(int number, int array[], int length)
{
    int counter = 0; 
    for(int i = 0; i < length; i++)
        if(array[i] == number)
            counter++;
    return counter;
}

int main()
{
    int numbers[10] = {3,4,1,2,4,5,6,5,4,5};
    int number_to_search = 5;
    std::cout << number_to_search << " appears "
              << count(number_to_search, numbers, 10)
              << " times in the array.";
    return 0;
}
4

7 に答える 7

5

このcount関数を使用します。

int count(int number, int array[], int length) {
    if (length == 0) return 0;
    return (number == *array) + count(number, array+1, length-1);
}
于 2013-08-31T07:26:39.683 に答える
2

このように試してみてはどうですか:-

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] = {3,4,1,2,4,5,6,5,4,5};

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

return 0;
}
于 2013-08-31T07:24:33.567 に答える
1

これがあなたがすることです(あなたの演習を台無しにするのを避けるために、コードは示しません)。

まず、再帰的にするには、関数が自分自身を呼び出す必要があることを思い出してください。次に、次の 2 点について検討します。

  • lengthパラメータがゼロに等しい場合、の戻り値はゼロでなけれcount(...)ばなりません
  • パラメータがゼロでない場合、 forおよび;lengthの戻り値を考慮してください。と呼びましょう。current の戻り値は、が に等しい場合は に等しくなり、が に等しくない場合は to になります。count(...)array + 1length-1priorcount(...)prior+1array[0]numberpriorarray[0]number

この記述からコードを作成するときifは、再帰関数の先頭に がどのようにあるかを観察してください。これにより、コードが基本ケース ( ) と再帰ステップ (再帰呼び出しに基づいて結果を計算する)ifに分割されます。length == 0これは再帰関数の一般的な構造です。再帰コードを記述するたびに、この構造を再現する必要があります。

于 2013-08-31T07:27:34.720 に答える
0
 #include <iostream>
 #include <ctime>
 #include <cstdlib>
 using namespace std;
 int i, j,n,c=0, k=0;
 int a[1000], b[1000];
 class Array {


    public:
        void input ()
        {
            cout<<"Enter how many values: ";
            cin>>n;
        }

        void arraySeries ()
        {
            cout<<"Array elements: ";
            srand(time(0));
            for (i=0; i<n; i++)
            {
                a[i]=rand()%100+1;
                cout<<a[i]<<" ";

            }
            cout<<endl<<endl;
            cout<<"Odd elements of array: ";
            for (i=0; i<n; i++)
            {   
                if(a[i]%2==1)
                {
                    b[i]=a[i];
                    k++;
                    cout<<b[i]<<" ";
                }

            }
        }
        // i want to find out how many times an odd number is found in b[i]
        // but i am not being able to do so. SOMEONE PLEASE HELP!!
        void OddSearch ()
        {
            cout<<endl<<endl;
            for (int k=1;k<100;k++)
            {
                c=0;
                for (i=0;i<n; i++)
                {

                    if (b[i]==k)
                    {
                        c++;
                    }
                    cout<<b[i]<<"occurs"<<c<<"times"<<endl;
                }
            }
        }
 };

 int main ()
 {
    Array obj;
    obj.input();
    obj.arraySeries();
    obj.OddSearch();

    return 0;
 }
于 2016-03-16T16:47:30.740 に答える