问题描述
我试图开发一个递归函数来查找序列的第n个项(1、3、7、17、41、99、239、577、1393 ...),但是我没有成功:
int progRec(int n){
return 2*progRec(n-1) + progRec(n-2);}
有什么想法吗?
解决方法
添加停止条件。我认为它是1 if n <= 2
:
int progRec(int n) {
if (n <= 2) {
return 1;
}
return 2 * progRec(n - 1) + progRec(n - 2);
}
您可以通过消除第二个分支(仅重新计算已访问的值)来优化此递归。只需将先前计算的条件作为参数传递即可:
int progRec(int n,int val = 1,int prev = 1) {
return n <= 2 ? val : progRec(n - 1,2 * val + prev,val);
}
您可以将其进一步优化为for
循环,因为现在它只是一个尾递归函数。