2017-08-04 20 views
2

1から10までの数字を受け取り、その範囲を出力する入力をしたかったのです。それ自身の呼び出し方法

入力が整数(チェック)かどうか、範囲が0-10(チェック)かどうかをチェックし、そうでなければユーザーに再度質問する必要があります。だから、再帰的な方法ですか?それが再びユーザに入力を依頼する試みを再ように、私は「にSystem.exit()」を交換したいと思います

import java.util.Scanner; 
import java.util.InputMismatchException; 

public class FinalTest { 
    public static void main (String [] args) { 

    Scanner in = new Scanner(System.in); 
    int k = 0; 

    System.out.print("int - "); 

    try { 
     k = in.nextInt(); 
    } catch (InputMismatchException e) { 
     System.out.println("ERR: Input"); 
     System.exit(1); 
    } 

    if(k <= 10 && k > 0) { 
     for(int j=1; j <= k; j++) { 
     System.out.println(j); 
     } 
    } else { 
     System.out.println("ERR: Oob"); 
     System.exit(1); 
    } 
    } 
} 

現在、私はこれを持っています。

main();を呼び出すとエラーが発生します。

この場合、mainメソッドを正しく呼び出すにはどうすればよいですか?ここ

+4

私はループをお勧めしたいことができるので、離れた再帰から滞在してみてください。 –

+3

これに対して再帰は必要ありません。ちょうどループを使用してください。参照:[whileおよびdo-whileステートメント](https://docs.oracle.com/javase/tutorial/java/nutsandbolts/while.html) – Jesper

+0

ループで固定します。あるいは、ロジックを関数に入れ、関数を再帰的に呼び出すこともできます。 – Scott

答えて

1

つの選択肢:

  • が実際にメソッドを作成し、
  • は、単にループ
を使用することを呼び出す

ループのように行くことができる:

boolean askForInput = true; 
while (askForInput) { 
    try { 
    k = in.nextInt(); 
    askForInput = false; 
    } catch ... 
    print "not a number try again" 
} 

しかし、それを超えて:あなたまだこのコードを自分のmethに入れたいod。そのコードはそれ自身を呼び出すべきではありませんが、分かりやすくするためです。同様に:

public static int askForNumber(Scanner in) { 
    ... code from above 
    return k; 
} 

そして、あなたの質問に答える:あなたはここに再帰を使用する必要はありません。あなたはループにしたい;はい、の再帰はループを実装する方法の1つですが、ここで実装する必要がある場合は単純に過剰です。

とレコードのために:あなたは、通常、階乗を計算する、またはフィボナッチとして、 計算タスクのために再帰を使用します。それを超えて

public static int askForNumber() { 
    while (askForInput) { 
    try ... 
     return in.nextInt(); 
    } catch ... 
    print "not a number try again" 
    } 
} 

:そのヘルパーメソッドを作成するときに、あなたが実際にそれを簡素化することができます例えば、hereを参照してください。範囲を印刷する再帰的な方法の一部について

+0

ねえ、答えをありがとう。非常に役立ちます。ちょうど1つ - なぜこれは動作していないのですか? 'boolean askForInput = true; while(askForInput){ System.out.print( "int - "); { k = in.nextInt(); askForInput = false; } catch(InputMismatchException e){ System.out.println( "ERR:Input"); } } ' – py9

+0

確かに。メモを削除しても構いません。 – GhostCat

+0

ERRをそのまま印刷します。毎回入力を促すべきではありませんか? 読みやすいようにpastebinのURLを書いてください:https://pastebin.com/vPrXw3MX – py9

1

public void printAscending(int n) { 
    if (n > 0) { 
    printAscending(n - 1); 
    System.out.println(n); 
    } 
} 
1

私は、再帰を使用して簡単な何かのためにあまりにも多くあり、おそらくより高価になると思います。入力された値が有効になるまで、スキャンビットの周りにwhileループを追加できます。 whileループから抜けると有効な場合は数値を意味するため、印刷前に条件をテストする必要がないように、印刷ループを中断します。プロセスを終了するために-1の値だけをテストすることができます。

public class FinalTest 
{ 
    public static void main (String [] args) 
    { 
     Scanner in = new Scanner(System.in); 
     int k = 0; 

     do 
     { 
      System.out.print("int - "); 

      try 
      { 
       k = in.nextInt(); 
      } 
      catch (InputMismatchException e) 
      { 
       System.out.println("ERR: Input"); 
       System.exit(1); 
      } 
     } 
     while(!(k>0 && k<=10) && k!=-1); 

     if(k!=-1) 
     { 
      for(int j=1; j<=k; j++) 
      { 
       System.out.println(j); 
      } 
     } 
     else 
     { 
      System.out.println("Bye Bye."); 
     } 
    } 
} 
1

いいえ、再帰を使用する必要がある場合は、私が個人的に行うことは、別の関数/メソッドを作成することです。メソッドを再起動する必要があるときは、そのメソッド内でメソッドを呼び出すだけです。だから、このようなものになるだろう:

private void recursiveMethod() { 
// do stuff . . . 
if (yourCondition) { 
    //continue to next piece of code 
} else { 
    recursiveMethod(); 
} 

}

しかし、大規模なプロジェクトで、あなた台無し場合、それは

関連する問題