【问题标题】:Recursion in Java - Partition theoryJava中的递归-分区理论
【发布时间】:2017-05-04 21:33:23
【问题描述】:

我一直在努力理解下一次递归,代码不是我的,是计算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 loops for-loop recursion partition


    【解决方案1】:

    有关 java 中递归的更基本的入门知识:http://www.javatpoint.com/recursion-in-java

    但在这种情况下,partition 被调用一次,然后继续调用自身,直到 n 达到零。这就是前面的 if 语句所做的。如果那个 if 语句不存在,它将无限继续下去。然后循环从参数中提取变量,因此从先前运行的方法中提取变量。它以这种方式将问题分解成更小的部分。

    【讨论】:

      【解决方案2】:

      如果你用输入 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

      一旦堆栈完成,它就会执行 i-- 所以新数字是 3 和 2

      然后继续

      【讨论】:

        【解决方案3】:

        这个递归背后的想法是自然数 N 的所有可能的partitions 可以由一个数 Ni 与 i 的每个分区组合而成,使用小于 i 的自然数,对于每个 1 ≤ i ≤ 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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-06-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多