Java划分理论中的递归

Java划分理论中的递归,java,loops,for-loop,recursion,partition,Java,Loops,For Loop,Recursion,Partition,我一直在试图理解下一个递归,代码不是我的,它是一个计算n个数的划分理论的代码,但是它的递归,它让我困惑。谁能解释一下它是如何工作的,这样我才能最终理解它。谢谢 package practicingjava; import java.util.Scanner; /** * @author JVASQUEZ */ public class PracticingJava { public static void main(String[] args) { Scanner

我一直在试图理解下一个递归,代码不是我的,它是一个计算n个数的划分理论的代码,但是它的递归,它让我困惑。谁能解释一下它是如何工作的,这样我才能最终理解它。谢谢

package practicingjava;

import java.util.Scanner;

/**
 * @author JVASQUEZ
 */
public class PracticingJava {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        partition(n, n, "");
    }

    public static void partition(int max, int n, String prefix) {
        if (n == 0) {
            System.out.println(prefix);
        }
        for (int i = Math.min(max, n); i >= 1; i--) {
            partition(i, n - i, prefix + " " + i);
        }
    }
}

有关java中递归的更基本的入门知识:


但在这种情况下,分区被调用一次,然后继续调用自己,直到n达到零。这就是前面的if语句所做的。如果那个If语句不存在,它将在无穷远处继续。然后循环从参数中提取变量,从而提取以前运行的方法。这样就把问题分解成更小的部分

如果您使用输入5调用它,它将打印

 5
 5
 4 1
 3 2
 3 1 1
 2 2 1
 2 1 1 1
 1 1 1 1 1
它基本上是把数字分解成更小的数字 当您输入5时,它用4和1调用递归函数 1无法分解 但它仍然是4

一旦堆栈完成,我就可以了-- 所以新的数字是3和2


它继续

这个递归背后的思想是,一个自然数N的所有可能都可以由一个数N-i和i的每个分区组成,每个分区使用小于i的自然数,每个1≤ 我≤ N∈ ℕ 并将0的分区集定义为空

如果数小于j的n的所有分区都是{n,j},那么n的所有分区都是

n,   {0, n)
n-1, {1, n-1}
n-2, {2, n-2}
n-3, {3, n-3}
...
1,   {n-1, 1}
其中
n-1,{1,n-1}
是由
{1,n-1}
组成的所有分区,每个分区都添加了前缀
n-1

例如,分区为5(为清晰起见,省略分解中的最大值)

{5} = 

i  n-i

5, {0} -> 5

4, {1} -> 4, (1, {0}) -> 4, 1

3, {2} -> 3, (2, {0}) -> 3, 2
          3, (1, {1}) -> 3, (1, 1, {0}) -> 3, 1, 1

2, {3} -> 
          2, (2, {1}) ->          
            2, 2, (1, {0}) -> 2, 2, 1
          2, (1, {2}) ->  
            2, 1, 1, (1, {0}) ->  2, 1, 1, 1

1, {4} ->  
        1, (1, {3}) ->
            1, 1, (1, {2}) ->
                1, 1, 1, (1, {1}) ->
                    1, 1, 1, 1, {0} -> 1, 1, 1, 1