求取斐波那契数列第N位的值。
斐波那契数列:每一位的值等于他前两位数字之和。前两位固定 0,1,1,2,3,5,8。。。。
解法一:暴力递归
public static int calculate(int num) {
if (num == 0) {
return 0;
}
if (num == 1) {
return 1;
}
return calculate(num - 1) + calculate(num - 2);
}
解法二:去重递归
递归得出具体数值之后、存储到一个集合(下标与数列下标一致),后面递归之前先到该集合查询一次,
如果查到则无需递归、直接取值。查不到再进行递归计算
public static int calculate2(int num) {
int[] arr = new int[num + 1];
return recurse(arr, num);
}
private static int recurse(int[] arr, int num) {
if (num == 0) {
return 0;
}
if (num == 1) {
return 1;
}
if (arr[num] != 0) {
return arr[num];
}
arr[num] = recurse(arr, num - 1) + recurse(arr, num - 2);
return arr[num];
}
解法三:双指针迭代
基于去重递归优化,集合没有必要保存每一个下标值,只需保存前两位即可,向后遍历,得出N的值
public static int iterate(int num) {
if (num == 0) {
return 0;
}
if (num == 1) {
return 1;
}
int low = 0;
int high = 1;
for (int i = 2; i <= num; i++) {
int sum = low + high;
low = high;
high = sum;
}
return high;
}