迭代n * F(n - 1)+((n - 1)* F(n - 2))

时间:2015-07-19 20:06:08

标签: algorithm recursion iteration

我坚持这个:n * F(n - 1)+((n - 1) * F(n - 2)),我知道如何递归地写这个。但不知道迭代。

我用它来递归:

long F_r(int n)
{
    if (n <= 2)
    {
        return 1;
    }
    else if (n > 2)
    {
        return n * F_r(n - 1) + ((n - 1) * F_r(n - 2));
    }
}

有人可以帮助我吗?

4 个答案:

答案 0 :(得分:3)

要知道迭代只调试n = 3或其他一些值(大于3会更好)。对于数学理解,这是什么:

.
.
.
F(0) = 1;
F(1) = 1;
F(2) = 1;
F(3) = 3* F(2) + (2* F(1));
     = 3*1 + (2*1);
     = 3 + 2;
     = 5;

F(4) = 4* F(3) + (3* F(2));
     = 4*5 + (3*1);
     = 20 + 3;
     = 23;

等等。

答案 1 :(得分:2)

要将其编写为迭代算法,您可以使用以下形式编写内容:

long F(int n) {
    long a = 1;
    long b = 1;
    long c = 1;
    for(int x = 3; x <= n; x++) {
        a = b;
        b = c;
        c = ...
    }
    return c;
}

答案 2 :(得分:2)

使用数组存储F的所有中间值:

long F_r(int n)
{
    long[] f = new long [n + 1]; // f[0] is not used
    f[1] = 1;
    f[2] = 1;
    for (int i = 3; i <= n; i++)
    {
        f[i] = i * f[i - 1] + ((i - 1) * f[i - 2]); // the formula goes here
    }
    return f[n];
}

如果您只想使用O(1)空格,请注意您不需要存储整个数组,只需要存储每个时间点的前两个值。 因此,可以在fgb's answer中重写。

答案 3 :(得分:1)

只是为了好玩 - 解决与Wolfram Alpha的递归关系,我们得到:

F(n) = (2 * factorial(n + 2) - 5 * subfactorial(n + 2)) / (n + 1)

我们可以将其计算为:

long F(int n) {
    long p = 1;
    long q = 1;
    for (int i = 1; i <= n + 2; i++) {
        p *= i;
        q = q * i + (1 - (i % 2) * 2);
    }
    return (2 * p - 5 * q) / (n + 1);
}