2

このプログラムは、ユーザーから値の範囲を取得し、その範囲に偶数のみを追加することになっています。再帰関数を実行して、表示する必要があるものを正確に表示しています。偶数のみを実際に追加する方法がわかりません。誰かが私を助けることができますか?

これが私のrecursive_functionです:

int recursive_function(int first_number, int second_number)
{
int even_range_sum = 0;

printf("\n    Entering sum function for range %d to %d",
    first_number, second_number);
if(first_number <= second_number)
{
    if(is_even(first_number) == 1)
    {
        printf("\n        Adding: %d", first_number);
        recursive_function(first_number + 1, second_number);
    }
    else
    {
        printf("\n        Skipping: %d", first_number);
        recursive_function(first_number + 1, second_number);
    }
}
printf("\n    Exiting sum function for range %d to %d ",
    first_number, second_number);
printf("with result: %d", even_range_sum);
return even_range_sum;
}

現在、すべての値がゼロになっています。変数はすべての関数の先頭で再宣言されているため、変数に対して何もしていません。追加をどこで行うべきかを誰かが教えてくれませんか。(返品明細書は 1 つしか書けないと思います) さらに詳しい情報が必要な場合は、お尋ねください。ありがとう

4

5 に答える 5

3

ロジックには 2 つの変更が必要です。

  1. 最初の数値が偶数の場合は、それを合計に追加します。それ以外の場合は何もしません。これは、内側の if/else ステートメントで発生するはずです。現在、コードは両方の部分で同じことを行います (異なる出力は別として)。

  2. 何があっても、関数を再帰的に呼び出して残りの合計を追加する必要があります。最初の数値が偶数であるかどうかにかかわらず、残りの範囲を追加する必要があるため、これは if/else の外で発生します。

    そして重要なことに、戻り値を使用する必要があります。あなたの関数は(部分的な)合計を返すので、その戻り値で何かをする必要があります。呼び出すだけで戻り値を無視すると、何も起こりません。

結果:

if (first_number <= second_number)
{
    if (is_even(first_number))
    {
        printf("\n        Adding: %d", first_number);
        even_range_sum += first_number;
    }
    else
    {
        printf("\n        Skipping: %d", first_number);
    }

    even_range_sum += recursive_function(first_number + 1, second_number);
}
于 2013-11-07T15:43:56.477 に答える
0

宿題のように思えるので、完全な解決策は投稿しません。<??>を記入してください

ヘルパー関数を作成できますか? 次に、ヘルパー関数に 3 つの引数を指定できます。合計、範囲内の最初の偶数と最後の数 (偶数である必要はありません)。

元の関数は、最初の偶数になるように、奇数の場合は開始値に 1 を追加します。算術演算で 1 となる数値は奇数なので、次のようにできます。

int even_summer(int range_start, int range_end)
{
  return even_summer_recursion(0, range_start & 1 ? range_start + 1 : range_start, range_end);
}

int even_summer_recursion(int acc, int current_even, int range_end)
{
    if( current_even > range_end )
        return acc; // return the accumulated result
    else // add the current to the acc and increment current to the next even value
        return even_summer_recursion( <??>, <??>, range_end); 
}

再帰が必要ない場合は、最初の偶数を for ループの開始値と同じ方法で作成し、アキュムレータを関数のローカル変数として使用することで、反復バージョンを簡単に作成できます。

int even_summer(int range_start, int range_end)
{
  int acc = 0;
  for(int current_even = ( is_even(range_start) ?  range_start : range_start + 1);
      current_even < range_end;
      current_even += <??>) {
    acc += <??>;
  }
  return acc;
}

ここでは、実際に youis_even関数を使用しました。

于 2013-11-07T16:20:10.193 に答える