2

関数を作成するのに少し苦労しています。反復と再帰を使用して、1 とユーザーが入力した数の間のすべての偶数の合計を見つけます。プログラム ガイドラインでは、この 3 つの方法を解決する関数が必要です。

  1. 反復
  2. 再帰

これは私がこれまでに持っているものです:

#include <iostream>
#include <iomanip>
#include <cstdlib>

using namespace std;

void formulaEvenSum(int num, int& evenSum)
{
    evenSum = num / 2 * (num / 2 + 1);
    return;
}

void loopEvenSum(int num, int& evenSum2)
{

}


int main()
{
    int num, evenSum, evenSum2;

     cout << "Program to compute sum of even integers from 1 to num.";
     cout << endl << endl;

     cout << "Enter a positive integer (or 0 to exit): ";
     cin >> num;

     formulaEvenSum(num, evenSum);
     loopEvenSum(num, evenSum2);

     cout << "Formula result = " << evenSum << endl;
     cout << "Iterative result = " << evenSum2 << endl;

     system("PAUSE");
     return 0;

}
4

6 に答える 6

3

反復を使用して偶数の合計を見つける方法は次のとおりです。

void loopEvenSum(int num, int &evenSum2)
{
    evenSum2=0;
    for (i=2;i<=num;i++)
    {
        if(i%2==0)
            evenSum2+=i;
    }
}

次のコードは、最も効率的ではありませんが、再帰関数の書き方を理解するのに役立ちます。

void recursiveEvenSum(int num,int &evenSum3,int counter)
{
    if(counter==1)
        evenSum3=0;
    if(counter>num)
        return;
    if(counter%2==0)
        evenSum3+=counter;
    recursiveEvenSum(num,evenSum3,counter+1);
}

これで、recursiveEvenSum(...) を次のように呼び出すことができます。

int evenSum3;
recursiveEvenSum(num,evenSum3,1);
于 2012-10-14T18:04:10.867 に答える
0

void の代わりに int を返すと、再帰的な方法がはるかに簡単になります。

void iterEvenSum(int num, int& evenSum2)
{
    evenSum2 = 0;
    if (num < 2) return;
    for (int i = 0; i <= num; i+=2)
    evenSum2 += i;
}

int recurEvenSum(int num)
{
    if (num < 0)    return 0;
    if (num < 4)    return 2;
    return num - num%2 + recurEvenSum(num-2);
}
于 2012-10-14T17:55:38.183 に答える
0

forループを使用して、それほど問題なく反復ソリューションを構築できるはずです。

再帰的なソリューションは、次の形式を取る場合があります。

f(a)
  if(a>0)
    return a+f(a-1)
  else
    return 0

f(user_input)

「深く掘り下げる」場合と、合計には影響しないが再帰からの登りを開始する回答を提供する場合を区別する必要があります (終了する方法は他にもあります)。

別の解決策は次の形式です。

f(a,sum,total)
  if(a<=total)
    return f(a+1,sum+a,total)
  else
    return sum

f(0,0,user_input)

この 2 番目の方法の利点は、一部の言語では「末尾再帰」と呼ばれるものを認識して最適化できることです。最初の再帰形式では、再帰の各レベルの中間結果を格納する必要があることがわかりますが、2 番目の形式では、最終的な回答を返すために必要なすべての情報が毎回渡されるため、これは必要ありません。

お役に立てれば!

于 2012-10-14T17:47:46.797 に答える
0

関数を呼び出す前に、evenSum1、evenSum2、evenSum3 の値を 0 に初期化することを忘れないでください。

void loopEvenSum(int num, int& evenSum2)
{
    for(int i = num; i > 1; i--)
        if(i%2 == 0)
            evenSum2+=i;
}

void RecursiveEvenSum(int num, int & evenSum3)
{
    if(num == 2)
    {
        evenSum3 + num;
        return;
    }
    else
    {
        if(num%2 == 0)
            evenSum3+=num;
        num--;
        RecursiveEvenSum(num, evenSum3);
    }
}
于 2012-10-14T17:51:16.907 に答える
0
void loopEvenSum(int num, int& evenSum2)
{
    eventSum2 = 0;
    for(int i = 1 ; i <= num; i++){
        (i%2 == 0) eventSum += i;
    }
}


void recurEvenSum(int num, int& evenSum3)
{
    if(num == 1) return;
    else if(num % 2 == 0) {
        eventSum3 += num;
        recurEvenSum(num-1, eventSum3);    
    }
    else recurEvenSum(num-1, eventSum3); 

}

ところで、メソッドを呼び出す前に初期化evenSumする必要があります。0

于 2012-10-14T17:53:00.870 に答える
0

セット [1,num] 内の 2 で割り切れるすべての数値の合計を反復アプローチを使用して取得するには、num から 2 に達するまでその範囲内のすべての数値をループし、現在の反復の数値を追加します。これが2で割り切れる場合は、合計に。

ループを開始する前に、evenSum2 にゼロを割り当てる必要があることに注意してください。そうしないと、結果はformulaEvenSum()と同じにはなりません。

void loopEvenSum(int num, int& evenSum2)
{
    assert(num > 0);
    evenSum2 = 0;
    for (int i=num; i>=2; --i) {
        if (0 == (i % 2)) {
            evenSum2 += i;
        }
    }
}

再帰的アプローチを使用して同じ結果を得るには、合計を保持する変数を参照渡しするのではなく、呼び出しごとに合計を返すことをお勧めします。それ以外の場合は、現在の再帰のカウンターを保持する必要があります。さらに悪いことに、再帰を開始する前に、呼び出し元で合計をゼロに設定する必要があります。

int recursiveEventSum(int num)
{
    assert(num > 0);
    if (num == 1) {
        return 0;
    } else {
        return ((num % 2) ? 0 : num) + recursiveEventSum(num-1);
    }
}

偶数から 2 (1 ではなく) を引いた場合にのみ偶数が得られるため、それらの数のみを反復することで最適化を行うことができ、最終的に num が奇数の場合は最初の反復を行うことに注意してください。

于 2016-01-25T08:48:27.840 に答える