使用递归生成序列

时间:2016-10-06 13:39:26

标签: c++ recursion

我正在尝试返回1 2 5 9 16 27 ...我们得到9 = 5 +(5-2)+(2-1),16 = 9 +(9-5)+(5- 2),等等。我正在返回它,因为我需要在另一个函数中使用它。我仍然得到递归的悬念,所以我不能为我的生活弄清楚如何正确地做到这一点。这是我到目前为止所尝试的内容:

int sequence(int n)
{
    if(n<=2) return n;
    else if(n==3) return 5;
    return sequence(n-1)+((sequence(n-1)-sequence(n-2))+((sequence(n-2)-sequence(n-3))));
}

编辑:我打算这个返回一个数字,前3个元素给出。

3 个答案:

答案 0 :(得分:1)

您实际上写了sequence(n-2)+sequence(n-3)而不是sequence(n-2)-sequence(n-3)(请注意+符号,而不是-

如果你看到,你真的不需要致电sequence(n - 2),因为-sequence(n - 2)+sequence(n - 2)将被删除并将表达式保留为sequence(n-1) + sequence(n-1) - sequence(n-3) < / p>

并且您不止一次以n - 1递归调用,可以节省一些运行时间,只调用一次并将结果存储在某个变量中并使用两次。

int sequence(int n)
{
    if(n<=2)
        return n;
    else if(n==3)
        return 5;
    int nMinus1 = sequence(n - 1);
    int nMinus3 = sequence(n - 3);
    return nMinus1 + nMinus1 - nMinus3;
}

请参阅此实施live here

但我真的建议使用动态编程来存储以前的结果并使用它们,因为它会大大减少运行时间。但是如果你必须使用递归并且不能简单地迭代来计算序列,那么你肯定可以这样做。

class SequenceGenerator{
private:
    static std::vector<int> results;
public:
    static int getNthInSequence(int n){
        if (results.size() == 0){
            results.push_back(0); // just to ignore the 0 index
            results.push_back(1);
            results.push_back(2);
            results.push_back(5);
        }
        if (n < results.size())
            return results.at(n);

        int nMinus1 = getNthInSequence(n - 1);
        int nMinus3 = getNthInSequence(n - 3);

        int result = nMinus1 + nMinus1 - nMinus3;
        results.push_back(result);
        return result;
    }
};

std::vector<int> SequenceGenerator::results;

Here is a live demo

答案 1 :(得分:0)

一旦你得到正确的数学,这里的实施只需要你的改动很少

int sequence(int n)
{
    if(n<=2) return n;
    else if(n==3) return 5;

    return 2 * sequence(n-1) - sequence(n-3);
}

答案 2 :(得分:-1)

f(n) = 2 * f(n - 1) - f(n - 2)
f(1) = 2
f(0) = 1

请检查一下,它对我有用:

#include <cstdio>

int suite_(int i){
    if(i == 0)
        return 1;

    if(i == 1)
        return 2;

    if(i == 2)
        return 5;

    return (2 * suite_(i -1) - suite_(i-3));
}

void main(){
    int j = 0;
    for (j=0; j < 10; ++j){
        printf("\nRes : %d",suite_(j));
    }
}

结果:

Res for 0: 1
Res for 1: 2
Res for 2: 5
Res for 3: 9
Res for 4: 16
Res for 5: 27
Res for 6: 45
Res for 7: 74
Res for 8: 121
Res for 9: 197
Res for 10: 320
Res for 11: 519
Res for 12: 841
Res for 13: 1362
Res for 14: 2205
Res for 15: 3569
Res for 16: 5776
Res for 17: 9347
Res for 18: 15125
Res for 19: 24474