2

桁数を指定して、桁数のすべての「順序付けられた」数字を出力するこのコードがあります

(number がxyzの場合、x<y<z の場合に順序付けられます)、

コードは機能しますが、for ループで使用されるロジックを理解できません。それは再帰ですが、誰かがもっと説明できるなら、それは素晴らしいことです.

class OrderedNumbers{

    public static void main(String args[]){
        printOrdered(0,0,3); // 3 digit numbers
    }

    private static void printOrdered(int number, int prev, int n) {

        if(n==0){
            System.out.println(number);
            return;
        }

        for(int i=(prev+1); i<(11-n); i++){
            printOrdered(number*10 + i, i, n-1) ;
        }

    }

}
4

3 に答える 3

3

引数を見てください。

  • numberは、これまでに作成された数です。その数値にもう 1 桁追加するために、最後の桁を追加する前に 10 を掛けます。
  • prev前の桁の値です。ループはその後for1 つずつ開始されるため、数値内の数字が順序付けられます。
  • nまだ追加されていない桁数です。それがゼロに達すると、再帰の深さが最大に達し、数値が出力されます。ループ内nの上限の計算にも使用します。for最後の数字は 9 以下、2 番目の数字は 8 以下などです。これは、条件が次のようにn=1読み取られるという事実からわかります。i<10i<=9

再帰呼び出しは、前の数値にもう 1 桁追加して渡し、その桁の値を次の数値が大きくなるようにし、残りの桁数を 1 減らします。

于 2012-10-12T20:30:55.227 に答える
1

関数の最後の引数は、関数が自分自身を呼び出す回数を制御します。がprintOrderedループ内で自分自身を呼び出すと、現在の数値が取り込まれ、move はそれを 10 倍します (数字を 1 桁左にシフトします)。次に、追加しますi(1 の場所に置きます)。n=0必要な数字がすべて追加されたことを関数が認識し、現在の数値を返す (出力する) 場合。

iは、前の桁よりも 1 つ多い (そうでなければ、順序付けられた数ではありません) から まで続きます11-n。これは、n桁のある数では、最上位の桁が と同じ大きさになることを示してい11-nます。3 桁の最大順序数を考えてみましょう789。百の位が 7 より大きくなることはありません。なぜでしょうか?

要約すれば

  • numberは、現在の (そしておそらく不完全な) 注文番号です
  • prev追加された最後の数字ですnumber
  • nは、追加する必要がある桁数です。number
  • inumber次の場所に追加できるすべての数字をループします。最後の桁よりも大きくする必要がありますが、printOrderedもう一度呼び出されたときに追加される残りの桁の余地を残しておいてください。
于 2012-10-12T20:42:57.500 に答える
1

まず、数字を「並べ替える」には、左端の桁が 未満でなければならないことに注意してください。(11-n)ここnで、 は桁数です。3 桁で作業している場合、「789」が注文されますが、左端の数字が 8 で、その後に 9 が続く場合、右端の位置を埋める上位の数字は残っていません。(他の数字も同様です。)

への最初の呼び出しprintOrderedで、forループは左端の位置で使用できるすべての有効な数字を生成します。そのような数字ごとに、再帰呼び出しは、左から 2 番目の位置で使用できるすべての有効な数字を生成します。numberは、出力する数を積み上げるアキュムレータですが、出力するn数が完全に積み上がるまでカウントダウンします。prev誤解を招くような名前が付けられています。この数字の左側に表示される数字です。数値を「順序付け」するには、より大きい数字のみを生成できますprev。これが、ループ変数が に初期化される理由prev + 1です。

于 2012-10-12T20:48:08.350 に答える