

以下のコードは、int型2つと、Stringで表現していますが、同じような出力結果を表現したいとき、この `r` をint
(引数がすべてint型)で書くとするとどのようなコードで表現できますか?

[code]

    public class Partitions {
        public static void main(String [] args){
            partition(7, 7, "");
        }
    
        public static void partition(int i, int n, String r) {
            if (n == 0) {
                System.out.println("{" + r + "}");
                return;
            }
    
            /*
               for (int j = Math.min(i, n);j >= 1;j--) {
               partition(j, n - j, j + (r.isEmpty()?"":",")+r);
               }
    
             */
    
            if( i<n ){
                for( int j=i ;j>=1;j--){
                    partition( j,n-j,j+(r.isEmpty()?"":",")+r);
                }
            }else{
                for (int j = n;j >= 1;j--) {
                    partition(j, n - j, j + (r.isEmpty()?"":",")+r);
                }
            }
        }
    }
    
[/code]


CC BY-SA 4.0
2021-08-04T04:47:25.307
80584
2021-08-06T20:33:56.237
2021-08-04T05:15:11.623
3060
47550
question
java
以下のコードと同じような出力をint 型のみで表現する。
  
  
`int`型変数をstackに見立てるのはどうでしょうか。

[code]

    import java.util.stream.Collectors;
    import java.util.stream.Stream;
    import java.util.stream.Stream.Builder;
    
    public class Partitions {
        public static void main(String[] args) {
            partition(7, 7, 0);
        }
    
        public static void partition(int i, int n, int r) {
            if (n == 0) {
                write(r);
                return;
            }
    
            if (i < n) {
                for (int j = i; j >= 1; j--) {
                    partition(j, n - j, push(r, j));
                }
            } else {
                for (int j = n; j >= 1; j--) {
                    partition(j, n - j, push(r, j));
                }
            }
        }
    
        static void write(int r) {
            String numbers = stream(r).map(String::valueOf).collect(Collectors.joining(","));
            System.out.println("{" + numbers + "}");
        }
    
        static int push(int r, int j) {
            return (r << 3) | j;
        }
    
        static Stream<Integer> stream(int r) {
            Builder<Integer> ret = Stream.builder();
            while (r > 0) {
                int v = r & 0x7;
                ret.add(v);
                r = r >>> 3;
            }
            return ret.build();
        }
    }
    
[/code]


CC BY-SA 4.0
2021-08-04T23:47:35.437
80599
2021-08-04T23:56:27.590
2021-08-04T23:56:27.590
2808
2808
80584
answer


引数 `r` は必要ないでしょう。

[code]

    import java.util.ArrayList;
    import java.util.List;
    
    public class Partitions {
      public static void main(String [] args){
        partition(7, 7).forEach(System.out::println);
      }
    
      public static List<List<Integer>> partition(int i, int n) {
        List<List<Integer>> result = new ArrayList<List<Integer>>();
    
        if (n == 0) {
          result.add(new ArrayList<Integer>());
          return result;
        }
    
        for (int j = Math.min(i, n);j > 0;j--) {
          for (List<Integer> row: partition(j, n - j)) {
            row.add(j); result.add(row);
          }
        }
    
        return result;
      }
    }
    
    // 実行結果
    [7]
    [1, 6]
    [2, 5]
    [1, 1, 5]
    [3, 4]
    [1, 2, 4]
    [1, 1, 1, 4]
    [1, 3, 3]
    [2, 2, 3]
    [1, 1, 2, 3]
    [1, 1, 1, 1, 3]
    [1, 2, 2, 2]
    [1, 1, 1, 2, 2]
    [1, 1, 1, 1, 1, 2]
    [1, 1, 1, 1, 1, 1, 1]
    
[/code]


CC BY-SA 4.0
2021-08-06T19:48:23.470
80648
2021-08-06T20:33:56.237
2021-08-06T20:33:56.237
47127
47127
80584
answer