0

この特定のプログラムの再帰を理解するのに少し苦労しています。いくつかの異なるオプションを試しましたが、再帰関数は初めてです。私が変更できるプログラムの部分は、関数 B の内部だけです。この関数は次のように計算します: Bn(a) = Bn−1(a) × Bn−2(a)、ただし B1(a) = B2(a) ) = a. したがって、B1(a) = a | B2(a) = a | B3(a) = a^2 | B4(a) = a^3 | B5(a) = a^5 | 等...

#include <iostream>
using namespace std;
float B(float a, int n)
{
   //Here is where I'm having an issue...
}
int main(void)
{ cout << "Input a float a, and an int n > 0: ";
   float a; int n;
   cin >> a >> n;
   cout << "B(" << a << ")_" << n << " = " << B(a,n) << endl;
   return 0;
}
4

1 に答える 1

3

最初に、再帰せずnに戻るように定義されている is 1 または 2のケースに注意してaください。これらは、いわゆる終了事由です。

float B(float a, int n)
{
   if (n == 1 || n == 2) { return a; }

   // ...
}

n次に、各時間から減算して、他のものを再帰します。

float B(float a, int n)
{
   if (n == 1 || n == 2) { return a; }

   return B(a, n - 1) * B(a, n - 2);
}

n2 より大きい値を渡すと、再帰呼び出しは最終的に終了ケースに到達し、その時点で実行が停止し、最初の呼び出しまでの最終結果が返されます。

呼び出しの例を見てみましょうB(2, 4)。これは終了ケースと一致しないため、関数は次のように再帰します。

  • B(2, 4)戻りB(2, 3) * B(2, 2)ます。
  • B(2, 3)戻りB(2, 1) * B(2, 2)ます。これをオリジナルに置き換えると、次のようになります(B(2, 1) * B(2, 2)) * B(2, 2)
  • 残っているのは終了ケースだけなので、これらをa: (2 * 2) * 2= 2 3 = 8 の値で置き換えることができます。

(代数的な単純化だけでなく) 実際に何が起こるかという限りでは、これは呼び出しツリーになります。

  • B(2, 4)終了ケースではない場合、次のように呼び出されます。
    • B(2, 3)終了ケースではない場合、次のように呼び出されます。
      • B(2, 2)は終了ケースで、2 を返します。
      • B(2, 1)は終了ケースで、2 を返します。
      • 戻り値は 2*2 = 4 になります。
    • B(2, 2)は終了ケースで、2 を返します。
    • 戻り値は 4*2 = 8 になります。
于 2013-11-08T20:02:03.827 に答える