0

我在弄清楚这个特定程序的递归时遇到了一些麻烦。我尝试了一些不同的选项,但我对递归函数是全新的。程序中唯一允许我修改的部分是函数 B 内部。该函数计算:Bn(a) = Bn−1(a) × Bn−2(a),其中 B1(a) = B2(a ) = 一个。所以 B1(a) = a | B2(a) = 一个 | B3(a) = a^2 | B4(a) = a^3 | B5(a) = a^5 | ETC...

#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

首先处理nis 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);
}

如果你传入一个n大于 2 的值,递归调用最终将到达终止情况,执行将在该点停止,将最终结果一直返回到第一次调用。

让我们举一个例子调用,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 回答