

5は、{5}{1,4}{1,1,3}{1,1,1,2}{1,1,1,1,1}{2,3}{2,1,2}これらの正の整数の和で表されます。  
また、7は、{7}{1,6}{1,1,5}{1,1,1,4}{1,1,1,1,3}{1,1,1,1,1,2}{1,1,1,1,1,1,1}{2,5}{2,1,4}{2,1,1,3}{2,1,1,1,2}{3,4}{3,1,3}{1,2,2,2}{2,2,3}のように表されますが、私の書いたプログラムでは、{1,2,2,2}{2,2,3}が出力されません。つまり、3つ以上の和の組み合わせのときに1以外のものを出力する方法が分かりません。1~5では、間の数字が1でもすべてのパターンを書くことができたのですが…

プログラム全体を修正する必要があると思いますが具体的にどう修正すればよいか教えていただきたいです。  
n,iは変化していき、rは固定(上では、5,7）のつもりで書きました。

**ソースコード:**

[code]

    public class HelloWorld{
        public static void main(String [] args){
            function(1, 4, 4);
        }
        
        public static void function(int i, int n, int r) {
            if (i >= n) return;
        
            write(i, n, r);
        
            if (n-1 <= i) {
                function(i+1, r-i, r);
            }
            
            function(i,n-1,r);
            
        }
        
        public static void write(int i, int n, int r){
            int k = r-(n-1)-i;
            if (r == n) System.out.print("{"+n+"}");
            System.out.print("{"+i);
    
            for(int j = 0; j < k; j++){
                System.out.print(",1");
            }
            System.out.print(","+(n-1)+"}");
       }
    }
    
[/code]

**実行結果:**

[code]

    function(1,4,4):
    ACTUAL:   {4}{1,3}{1,1,2}{1,1,1,1}{2,2}
    EXPECTED: {4}{1,3}{1,1,2}{1,1,1,1}{2,2}
    function(1,5,5):
    ACTUAL:   {5}{1,4}{1,1,3}{1,1,1,2}{1,1,1,1,1}{2,3}{2,1,2}
    EXPECTED: {5}{1,4}{1,1,3}{1,1,1,2}{1,1,1,1,1}{2,3}{2,1,2}
    function(1,7,7):
    ACTUAL:   {7}{1,6}{1,1,5}{1,1,1,4}{1,1,1,1,3}{1,1,1,1,1,2}{1,1,1,1,1,1,1}{2,5}{2,1,4}{2,1,1,3}{2,1,1,1,2}{3,4}{3,1,3}
    EXPECTED: {7}{1,6}{1,1,5}{1,1,1,4}{1,1,1,1,3}{1,1,1,1,1,2}{1,1,1,1,1,1,1}{2,5}{2,1,4}{2,1,1,3}{2,1,1,1,2}{3,4}{3,1,3}{1,2,2,2}{2,2,3}
    
[/code]


CC BY-SA 4.0
2021-08-01T15:18:26.767
80522
2021-08-10T19:06:17.637
2021-08-02T01:21:30.257
3060
47550
question
java
バックトラッキング法を用いた分割数の出力について