Java递归例程

Java递归例程,java,recursion,Java,Recursion,我正在实现一个递归例程来计算多项式表达式的所有项,基本上是多项式展开式。我认为这会转化为一个问题,大致如下- 给定一组n个数,其值范围为[0,1,2,…n],可实现k和的最大组合数是多少 下面是递归例程- public static String []multinomial_elements; public static void multichoose(int n,int k) { String[] result = null; System.out.print("Callin

我正在实现一个递归例程来计算多项式表达式的所有项,基本上是多项式展开式。我认为这会转化为一个问题,大致如下-

给定一组n个数,其值范围为[0,1,2,…n],可实现k和的最大组合数是多少

下面是递归例程-

public static String []multinomial_elements;
public static void multichoose(int n,int k)
{
    String[] result = null;
    System.out.print("Calling multichoose with");
    System.out.println("  "+Integer.toString(n)+"  "+Integer.toString(k));
    if(n==1)
    {
        multinomial_elements[result_iter]=multinomial_elements[result_iter]+Integer.toString(k)+"|";
        ++result_iter;
    }
    else
    {
        if(k==0)
        {
            result=new String[1];
            result[0]="0";
            for(int a=0;a<n;a++)
                multinomial_elements[result_iter]=multinomial_elements[result_iter]+"0"+"|";
            ++result_iter;   
        }
        else 
        {
            for(int firstindexval=k;firstindexval>=0;firstindexval--)
                for(int iter=0;iter<=k-firstindexval;iter++)
                {
                    if(iter+firstindexval==k){

                        multinomial_elements[result_iter]=multinomial_elements[result_iter]+Integer.toString(firstindexval)+"|";

                        multichoose(n-1,iter);
                    }

                }

        }
    }

}
任何关于我做错了什么的指点或暗示都会大有帮助

谢谢
p1ng

您的例程的目的似乎是,给定k的总和和n个项的总数,找到填充n个项的所有排列,其值介于0和k之间(包括)。我假设这意味着,对于n=3,k=3的情况,你需要

3|0|0|
2|0|1|
2|1|0|
1|0|2|
1|1|1|
1|2|0|
0|0|3|
0|1|2|
0|2|1|
0|3|0|

然而,您的代码有点随意。特别是,循环forint iter=0;Itery您的代码似乎没有按照您的描述所建议的那样执行。您能否提供一个简单的示例,说明您期望的输出是什么以及为什么?应该选择什么3、3;计算
3|0|0|
2|0|1|
2|1|0|
1|0|2|
1|1|1|
1|2|0|
0|0|3|
0|1|2|
0|2|1|
0|3|0|
public static void multichoose(int n,int k, String currentSolution /* NEW ARGUMENT */)
{
    // String[] result = null; /* UNNECESSARY */
    System.out.print("Calling multichoose with");
    System.out.println("  "+Integer.toString(n)+"  "+Integer.toString(k));
    if(n==1)
    {
        // multinomial_elements[result_iter]=multinomial_elements[result_iter]+Integer.toString(k)+"|";
        multinomial_elements[result_iter]=currentSolution+k+"|"; /* CHANGED */
        ++result_iter;
    }
    else
    {
        if(k==0)
        {
            // result=new String[1]; /* UNNECESSARY */
            // result[0]="0"; /* UNNECESSARY */
            for(int a=0;a<n;a++)
                // multinomial_elements[result_iter]=multinomial_elements[result_iter]+"0"+"|";
                currentSolution += "0|"; /* CHANGED */
            multinomial_elements[result_iter] = currentSolution; /* NEW */
            ++result_iter;   
        }
        else 
        {
            for(int firstindexval=k;firstindexval>=0;firstindexval--)
                //for(int iter=0;iter<=k-firstindexval;iter++) /* UNNECESSARY */ 
                //{ /* UNNECESSARY */
                    //if(iter+firstindexval==k){ /* UNNECESSARY */

                        //multinomial_elements[result_iter]=multinomial_elements[result_iter]+Integer.toString(firstindexval)+"|"; /* SEE CHANGE BELOW */

                        //multichoose(n-1,iter);
                        multichoose(n-1, k-firstindexval /* CHANGED */, currentSolution+firstindexval+"|" /* NEW ARGUMENT */); /* CHANGED */
                    //} /* UNNECESSARY */

                //} /* UNNECESSARY */

        }
    }

}