原题目:
// 数列前2项为 1 1,从第3项开始,若为奇数项,则值为前两项之和,若为偶数项,则值为前两项之和的2倍
// 可知该数列前6项为 1 1 2 6 8 28
// 求该数列的第n项
// 请用递归和循环两种方式实现
思路说明:使用递归实现这种方式比较简单不再描述
使用循环实现时需要注意两点
1.从第三项开始奇数跟偶数计算方式不同 需要联想到求余分别处理
2.前两项都为1不用考虑,从第三项开始如果索引下标从0开始算,for循环就从i==2开始算,此刻是奇数 应该是a[i-1]+a[i-2] //递归实现
private static long recMethod(int n) {
if (n <= 2) {
return 1;
}
//奇数N=(N-1)+(N-2)
if (n % 2 == 1) {
return recMethod(n - 1) + recMethod(n - 2);
} else {
//偶数N=2*((N-1)+(N-2))
return 2 * (recMethod(n - 1) + recMethod(n - 2));
}
}
//循环实现
private static long cirMethod(int n) {
if (n <= 2) {
return 1;
}
int[] a = new int[n];
a[0] = 1;
a[1] = 1;
int i = 0;
//从第三个值开始算,即i=2时是第三位为奇数
for (i = 2; i < n; i++) {
if (i % 2 == 1) {
a[i] = 2 * (a[i - 1] + a[i - 2]);
} else {
a[i] = a[i - 1] + a[i - 2];
}
}
return a[i - 1];
}