/**
* Tribonacci 数字序列的计算。<br>
* 规则是T(n) = T(n - 1) + T(n - 2) + T(n -3)<br>
* 其中T(0) = T(1) = 1,T(2) = 2<br>
* 不考虑整数的溢出问题。
*
* @author 老紫竹(java2000.net, laozizhu.com)
*/
public class TribonacciNumber {
public static void main(String[] args) {
TribonacciNumber tn = new TribonacciNumber();
int number = 32;
long begin = System.currentTimeMillis();
System.out.println(tn.calTribonacci(number));
long end = System.currentTimeMillis();
System.out.println(end - begin);
begin = System.currentTimeMillis();
System.out.println(tn.calTribonacciCache(number));
end = System.currentTimeMillis();
System.out.println(end - begin);
}
/**
* 普通算法,有重复计算。
*
* @param n
* @return
*/
public int calTribonacci(int n) {
if (n == 0) {
return 1;
}
if (n == 1) {
return 1;
}
if (n == 2) {
return 2;
}
return calTribonacci(n - 1) + calTribonacci(n - 2) + calTribonacci(n - 3);
}
// 缓冲区
private int[] nums = new int[3];
{
nums[0] = 1;
nums[1] = 1;
nums[2] = 2;
}
// 当前最大的缓冲数字
private int maxCached = 2;
/**
* 带缓冲的计算,减少了大量的重复计算。<br>
* 效率极大提高。
*
* @param n
* @return
*/
public int calTribonacciCache(int n)
{
// 小于的,直接用缓冲
if (n <= maxCached) {
return nums[n % 3];
}
// 否则计算
nums[n % 3] = calTribonacciCache(n - 3) + calTribonacciCache(n - 2) + calTribonacciCache(n - 1);
maxCached = n;
return nums[n % 3];
}
}
这个算法的核心思想是在于:
把num[n]存储了计算的值!所以以后用时就不用再 计算了!!
计算了 T[5]那么 计算T【6】可以直接用!!
这个算法很强!!