2017-01-21 5 views
0

例: For example, given 13, return: [1,10,11,12,13,2,3,4,5,6,7,8,9].整数nを指定すると、辞書順に1 - nを返します。

以下の解決法が実際にはうまく機能します。私は少し苦労してそれを見つけました、そして、私はそれが実際に働いているか理解できません。純粋な魔法のようだ。我々は再帰呼び出しを行うと、どのように世界でstart引数は、まだ10

public static ArrayList<Integer> lexicalOrder(int n) { 
    ArrayList<Integer> result = new ArrayList<>(); 
    dfs(1, 9, n, result); 
    return result; 
} 
private static void dfs(int start, int end, int n, ArrayList<Integer> result){ 
    for (int i = start; i <= end && i <= n; i++){ 
     result.add(i); 
     //Just printing out the end and start to try to understand 
     System.out.println("Start : " + start + " End : " + end); 
     //If i is 10, how does 10 * 10 end up as 10 again for several iterations??? 
     dfs(i * 10, i * 10 + 9, n, result); 
    } 
} 

を再帰的に二時間後、私は魔法を信じていないされているので、誰かがこれが動作しているか説明してくださいできますか?最初の反復startは1であり、endは予想通り9です。次に、2回目の反復で期待したように、開始は10と19です。それでは、私たちは次の再帰呼び出しをした後、開始が100、終了が109になることを期待しています。ただし、以前の再帰のときと同じです(10および19)。

+2

ステップ***。また、 'return IntStream.rangeClosed(1、n).boxed()。sorted((a、b) - > String.valueOf(a).compareTo(String.valueOf(b))) \t \t \t \t .collect (Collectors.toList()); ' –

+0

私はデバッガを踏んで、何が起きているのかを見ています。実際には100と109になり、whileループの条件は失敗します。なぜなら、iはもはやnより小さくないからです。しかし、私は10と19でどうやって終わるのかちょっと混乱していると思います。 –

+0

@ElroyJetson 'dfs(10,19、n、result)'が複数回呼び出されます – Natecat

答えて

1

非常に簡単です。あなたは再帰とループの両方を持っています。したがって、DFS(1,9,13)の最初の呼び出しは、実際にこのん:他のすべての例では最初の2つのパラメータが大きいので、DFSへ

add 1 to result and call dfs (10,19,13), 
add 2 to result and call dfs (20,29,13) 
... 
add 9 to result and call dfs (90,99,13). 

のみコール(10,19,13)は、実際には何もありません第3より。

DFS(10,19,13)への呼び出しは、この処理を行います。

add 10 to result and call dfs (100, 109, 13) 
add 11 to result and call dfs (110, 119, 13) 
add 12 to result and call dfs (120, 129, 13) 
add 13 to result and call dfs (130, 139, 13) 

14は、開始と終了予定の13

あなたが見ている行動、より大きいので、それはその後、終了10と13に戻るのは、この2番目の再帰呼び出しのセットが、終端して囲みループに戻る結果です。

1

基本的には何らかの数字になり、0から9までの数字が付加され、その数字に行き、0から9までの数字がN(この場合は13)を超えてスキップされます)。

は、ここで「私は」左センタリングを見て、何が起こっているか見ることが容易であるかもしれないカップルのステップスルー

です。

"i"           return 
1 //Add to list       {1} 
10 //Add to list       {1,10} 
100 //Bigger than n! (n = 13)    {1,10} 
11 //Add to list       {1,10,11} 
110 //Bigger than n! (n = 13)    {1,10,11} 
12 //Add to list       {1,10,11,12} 
120 //Bigger than n! (n = 13)    {1,10,11,12} 
13 //Add to list       {1,10,11,12,13} 
130 //Bigger than n! (n = 13)    {1,10,11,12,13} 
14 //Bigger than n! (n = 13)    {1,10,11,12,13} 
2 //Add to list       {1,10,11,12,13,2} 
20 //Bigger than n! (n = 13)    {1,10,11,12,13,2} 
3 //Add to list       {1,10,11,12,13,2,3} 
30 //Bigger than n! (n = 13)    {1,10,11,12,13,2,3} 
4 //Add to list       {1,10,11,12,13,2,3,4} 
40 //Bigger than n! (n = 13)    {1,10,11,12,13,2,3,4} 
5 //Add to list       {1,10,11,12,13,2,3,4,5} 
50 //Bigger than n! (n = 13)    {1,10,11,12,13,2,3,4,5} 
6 //Add to list       {1,10,11,12,13,2,3,4,5,6} 
60 //Bigger than n! (n = 13)    {1,10,11,12,13,2,3,4,5,6} 
7 //Add to list       {1,10,11,12,13,2,3,4,5,6,7} 
70 //Bigger than n! (n = 13)    {1,10,11,12,13,2,3,4,5,6,7} 
8 //Add to list       {1,10,11,12,13,2,3,4,5,6,7,8} 
80 //Bigger than n! (n = 13)    {1,10,11,12,13,2,3,4,5,6,7,8} 
9 //Add to list       {1,10,11,12,13,2,3,4,5,6,7,8,9} 
90 //Bigger than n! (n = 13)    {1,10,11,12,13,2,3,4,5,6,7,8,9} 
10 //Bigger than end! (end = 9)   {1,10,11,12,13,2,3,4,5,6,7,8,9} 

何が起こっているかのより完全なバージョン:***デバッガとそれによる

lexicalOrder(13) 
    result = {} 
    dfs(1,9,13,result) //1 is the smallest digit, 9 is the largest digit, 
         //13 is the largest possible value, 
         //Passed in "result" array to be edited. 
     i = start 
     //i = 1 
     Enter Loop 
     result.add(1) 
     //result = {1} 
     dfs(10,19,13,result) 
      i = start 
      //i = 10 
      Enter Loop 
      result.add(10) 
      //result = {1,10} 
      dfs(100,109,13,result) 
       i = start 
       //i = 100 
       Enter Loop 
       Whoops! "i" is greater than "n"! //n = 13 
       Exit Loop 
      i++ 
      //i = 11 
      result.add(11) 
      //result = {1,10,11} 
      dfs(110,119,13,result) 
       i = start 
       //i = 110 
       Enter Loop 
       Whoops! "i" is greater than "n"! //n = 13 
       Exit Loop 
      i++ 
      //i = 12 
      result.add(12) 
      //result = {1,10,11,12} 
      dfs(120,129,13,result) 
       i = start 
       //i = 120 
       Enter Loop 
       Whoops! "i" is greater than "n"! //n = 13 
       Exit Loop 
      i++ 
      //i = 13 
      result.add(13) 
      //result = {1,10,11,12,13} 
      dfs(130,139,13,result) 
       i = start 
       //i = 130 
       Enter Loop 
       Whoops! "i" is greater than "n"! //n = 13 
       Exit Loop 
      i++ 
      //i = 14 
      Whoops! "i" is greater than "n"! //n = 13 
      Exit Loop 
     i++ 
     //i = 2 
     result.add(i) 
     //result = {1,10,11,12,13,2} 
     dfs(20,29,13,result) 
      i = start 
      //i = 20 
      Enter Loop 
      Whoops! "i" is greater than "n"! //n = 13 
      Exit Loop 
     i++ 
     //i = 3 
     result.add(i) 
     //result = {1,10,11,12,13,2,3} 
     dfs(30,39,13,result) 
      i = start 
      //i = 30 
      Enter Loop 
      Whoops! "i" is greater than "n"! //n = 13 
      Exit Loop 
     i++ 
     //i = 4 
     result.add(i) 
     //result = {1,10,11,12,13,2,3,4} 
     dfs(40,49,13,result) 
      i = start 
      //i = 40 
      Enter Loop 
      Whoops! "i" is greater than "n"! //n = 13 
      Exit Loop 
     i++ 
     //i = 5 
     result.add(i) 
     //result = {1,10,11,12,13,2,3,4,5} 
     dfs(50,59,13,result) 
      i = start 
      //i = 50 
      Enter Loop 
      Whoops! "i" is greater than "n"! //n = 13 
      Exit Loop 
     i++ 
     //i = 6 
     result.add(i) 
     //result = {1,10,11,12,13,2,3,4,5,6} 
     dfs(60,69,13,result) 
      i = start 
      //i = 60 
      Enter Loop 
      Whoops! "i" is greater than "n"! //n = 13 
      Exit Loop 
     i++ 
     //i = 7 
     result.add(i) 
     //result = {1,10,11,12,13,2,3,4,5,6,7} 
     dfs(70,79,13,result) 
      i = start 
      //i = 70 
      Enter Loop 
      Whoops! "i" is greater than "n"! //n = 13 
      Exit Loop 
     i++ 
     //i = 8 
     result.add(i) 
     //result = {1,10,11,12,13,2,3,4,5,6,7,8} 
     dfs(80,89,13,result) 
      i = start 
      //i = 80 
      Enter Loop 
      Whoops! "i" is greater than "n"! //n = 13 
      Exit Loop 
     i++ 
     //i = 9 
     result.add(i) 
     //result = {1,10,11,12,13,2,3,4,5,6,7,8,9} 
     dfs(90,99,13,result) 
      i = start 
      //i = 90 
      Enter Loop 
      Whoops! "i" is greater than "n"! //n = 13 
      Exit Loop 
     i++ 
     //i = 10 
     Whoops! "i" is greater than "end"! //end = 9 
    return result // result = {1,10,11,12,13,2,3,4,5,6,7,8,9} 
関連する問題