使用递归生成序列
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秒
相关文章:
- 通过递归进行因子分解
- 递归函数计算序列中的平方和(并输出过程)
- 使用递归的数组的最小值.这是怎么回事
- 递归列出所有目录中的C++与Python与Ruby的性能
- 递归计数给定目录的文件和所有目录
- 如何在BST的这个简单递归实现中消除警告
- C++:正在检查LinkedList中的回文-递归方法-错误
- 递归模板化函数不能分配给具有常量限定类型"const tt &"的变量"state"
- 递归无序映射
- TSP递归解的迭代形式
- 如何在Elixir中调用递归函数并行
- 返回递归调用和仅递归调用的区别
- 数组元素打印的递归方法
- 使用递归时获取变量的奇怪值
- 如何在C++中递归地按相反顺序打印集合
- 到连接组件算法的问题(递归)
- 如何使用递归打印修改后的星号三角形图案
- 使用递归模板动态分配的多维数组
- 递归函数有效,但无法记忆
- 包含模板文件的递归会导致编译失败