我的解法如下:
/**
* 复杂递归的计算,这个好像O(n^n)
* 用来计算上面那个公式的方法
* @param num
* @return
*/
public double getResult(int num)
{
//递归出口,即N=0时,公式的和
if(num == 0)
{
return 4.0 / 3;
}
double sum = 0;
//这里进行递归
//这里并不好,因为每个不同的整数i都要独立计算,没有利用前面i-1的计算资源
//所以算法运行时间过长
for(int i = 0; i < num; i++)
{
sum += this.combine(i, num) * getResult(i);
}
return sum / 3;
}
/**
* 递归方法求组合数
* @param up 上标
* @param down 下标
* @return
*/
public int combine(int up, int down)
{
//1.递归出口
if(up == 0)
{
return 1;
}
//2.小于一半时进入递归
if(up <= down / 2)
{
return (down - up + 1) / up * combine(up - 1, down);
}
//3.大于一半时,可以将其化为小于一半的请款
//以节省计算资源
else
{
return combine(down - up, down);
}
}
这个算法运行时间模式不好,递归时没有利用前面的计算资源,不符合递归的第四原则:最佳合成效益原则。后续想办法再做改进。