我正在尝试返回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个元素给出。
答案 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;
答案 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