使用递归生成序列

Generate sequence using recursion

本文关键字:递归      更新时间:2023-10-16

我试图返回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个元素是给定的。

您实际上写的是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)

表达式

如果你不止一次地递归调用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;
}

查看这个实现在这里。


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

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;

一旦你得到了正确的数学,这里有一个对你的实现做了最小的改变

int sequence(int n)
{
    if(n<=2) return n;
    else if(n==3) return 5;
    return 2 * sequence(n-1) - sequence(n-3);
}
<>以前f (n) = 2 * (n - 1) - f (n - 2)F (1) = 2F (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: 11: 22点5分3点9分4点16分预定5点27分预定6点45分7点74分8点121分9点197分10点32分预订11点519分预定12点841分预定13点13分62秒预订14:2205预订15点35分69秒预订16:5776预订17点93分47秒预定18点15分125秒