Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 求分区的复递归公式_Java_Algorithm_Recursion - Fatal编程技术网

Java 求分区的复递归公式

Java 求分区的复递归公式,java,algorithm,recursion,Java,Algorithm,Recursion,我试图用下面的公式计算一个自然数的分区。该公式生成两个正数,然后生成两个负数,依此类推。当P(n)

我试图用下面的公式计算一个自然数的分区。该公式生成两个正数,然后生成两个负数,依此类推。当P(n)<0时停止,例如

  p(3) = p(2) + p(1) = 3
  p(4) = p(3) + p(2) = 3 + 2 = 5
  p(5) = p(4) + p(3) -  p(0) = 5 + 3 - 1 = 7
  p(6) = p(5)  + p(4) - p(1) = 7 + 5 - 1 = 11
  *P(0) = 1 by convention
换句话说,为了计算p(5),你必须计算p(4),它等于p(3)+p(2),p(3)等于p(2)+p(1),最后-p(0)等于1。你必须遍历每一个,找到它们相等的值,然后求和。所以要找到一个数字的分区,你必须找到所有其他数字的分区。我已经尝试了一些你可以看到下面的代码,但它不工作。k=我的代码中的计数器

    Code:
    public static long SerialFib( long n ) 
    { 
        long exponent = 0;
        double ex;
        long counter = 1;
        ex = Math.pow(-1, counter - 1);
        exponent = (long) ex;
        if (n < 0)
        {
            return 0;
        }
        else
        {

            return SerialFib((exponent * (n - ( (counter * ( (3 * counter) - 1)) / 
            2)))) + SerialFib((exponent * (n - ( (counter * ( (3 * counter) +1))/2))));

        }
    } 

代码:
公共静态长序列fib(长n)
{ 
长指数=0;
双前;
长计数器=1;
ex=数学功率(-1,计数器-1);
指数=(长)ex;
if(n<0)
{
返回0;
}
其他的
{
返回SerialFib((指数*(n-((计数器*((3*计数器)-1))/
2) )+SerialFib((指数*(n-((计数器*((3*计数器)+1))/2));
}
} 

计数器将始终为1,因为您没有将其传递回SerialFib。此外,还需要一个基本情况,当n等于0时,它将返回1

第一个基本情况:

if(n==0)
   return 1;
SerialFib应具有计数器的另一个参数:

SerialFib(long n, int counter)
调用SerialFib时,它应该如下所示:

SerialFib( [your formula], ++counter);