题目介绍
AKA Tribonacci 是Fibonacci (斐波那契)的兄弟,它们的原理很相似,Fibonacci序列的元素是由前两个元素相加的得到的,而Tribonacci是由前3个元素相加得到的,举个例子:
[1, 1 ,1, 3, 5, 9, 17, 31, …]
现在给出一个double数组s,和一个非负整数n,要求得到Tribonacci序列的前n个元素组成的数组,测试用例如下:
s={1,1,1} n=10 =>{1,1,1,3,5,9,17,31,57,105}
第一次代码
public class Xbonacci {
public double[] tribonacci(double[] s, int n) {
double[] result = new double[n];
if (n == 0) {
return result;
} else {
for (int i = 0; i < n; i++) {
if (i < 3)
result[i] = s[i];
else {
result[i] = result[i-3] + result[i-2] + result[i-1];
}
}
return result;
}
}
public static void main(String[] args) {
Xbonacci variabonacci = new Xbonacci();
double[] a = variabonacci.tribonacci(new double []{1,1,1},10000);
double[] b = variabonacci.tribonacci(new double []{0,0,1},10000);
double[] c = variabonacci.tribonacci(new double []{0,1,1},10000);
}
}
优化的代码
public class Xbonacci {
public double[] tribonacci(double[] s, int n) {
double[] result = Arrays.copyOf(s, n);
for (int i = 3; i < n; i++) {
result[i] = result[i-3] + result[i-2] + result[i-1];
}
return result;
}
public static void main(String[] args) {
Xbonacci variabonacci = new Xbonacci();
double[] a = variabonacci.tribonacci(new double []{1,1,1},10000);
double[] b = variabonacci.tribonacci(new double []{0,0,1},10000);
double[] c = variabonacci.tribonacci(new double []{0,1,1},10000);
System.out.println("end!"+a.toString()+b.toString()+c.toString());
}
}
分析
优化前971945纳秒,优化后899771纳秒,优化版本用了Arrays的copyof方法拷贝数组,使得代码更加简洁。