2016-04-24 17 views
-4

私はJavaを使い慣れていません。私はそれについていくつかの本を読んでいます。 私はこのコードの出力が生成方法を見つけ出すことはできません。このコードはどのようにコンパイラで実行されますか?

import java.util.*; 

class myclass { 
    public static void main(String[] args) { 
     Scanner myScanner = new Scanner(System.in); 
     System.out.println(factorial(myScanner.nextInt())+"\n"); 
    } 

    public static int factorial(int n) { 
     if (n==0) { 
      return 1; 
     } else {  
      int recurse = factorial(n-1); 
      int result = recurse*n; 
      return result; 
     } 
    } 
} 

誰もが、このステップバイステップの私のために説明していただけますか? 私はメインメソッドとScannerクラスを理解していますが、入力時に8のような整数を入力すると、私は40320を出力します。

+0

質問に正しくタグを付けてください。その後、デバッガを使用してコードを1行ずつ実行します。 –

+0

あなたは[階乗関数](https://en.wikipedia.org/wiki/Factorial)に精通していますか? 8! 40320であり、これは期待される出力です。 – Michael

答えて

0

適切に書式を設定すると、コードを処理するのが容易になりますので、あとでやってください。時には、コードを簡潔にすると、コードが処理しやすくなります。

public static int factorial(int n) { 

    if (n == 0) { 
     return 1; 
    } 
    else { 
     int recurse = factorial(n - 1); 
     return recurse * n; 
    } 
} 

以上単に:

public static int factorial(int n) { 
    if (n == 0) { 
     return 1; 
    } 
    return n * factorial(n-1); 
} 

今度は、いくつかの値を試してみましょうあなたは "インライン" result変数できることに注意してください。 "0"の値を試してみましょう:

public static int factorial(int n) { 
    if (n == 0) { 
     return 1; //<-- Returns 1 
    } 
    return n * factorial(n-1); 
} 

= 1

はのは、 "1" の値を試してみましょう:

public static int factorial(int n) { 
    if (n == 0) { 
     return 1; //not reached 
    } 
    return n * factorial(n-1); //<-- 1 * factorial(0) = 1 * 1 = 1 
} 

グッド:1! = 1

はさんは "8" の値を試してみましょう:

public static int factorial(int n) { 
    if (n == 0) { 
     return 1; //not reached 
    } 
    return n * factorial(n-1); //<-- 8 * factorial(8-1) = 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1 = 40320 
} 

これは8以来、理にかなっています! = 40,320。

この方法は本質的に自身を呼び出すため、再帰と呼ばれています。コードが一般にかなり簡潔であり、"divide and conquer"のメンタリティの1つであるため、うまくいけば、再帰はプログラミングの美しい部分です。これはプログラミングの導入概念です。

良いプログラマーは、常に価値観を考えています。したがって、この場合、nが-1の場合、関数はStackOverFlowエラーを返します。 (コードをif (n <= 1)と変更することができます)。

0

関数階乗は、階乗を解くために再帰を使用します。これは、nが0(1を返す)になるまで、関数がそれ自身を複数回呼び出すことを意味します。 n = 3のために、プログラムは、それがどのような階乗(0)知っている今、あなたは、一緒に物事を追加することができます

Factorial(3) = factorial(2) * 3, 
Factorial(2) = factorial(1) * 2, 
Factorial(1) = factorial(0) * 1, 
Factorial(0) = 1 (Because of the *if-statement*) 

に結果を設定することで起動するよう

、階乗(1)、階乗(2 )とFactorial(3)があります。

それから、次のようになります。すべての

Factorial(0) = 1, 
Factorial(1) = 1 * 1 = 1, 
Factorial(2) = 1 * 2 = 2, 
Factorial(3) = 2 * 3 = 6 
0

まず:Factorial function

私はあなたが再帰的な階乗の機能を理解していないと仮定します。関数の

宣言:

public static int factorial(int n){ 

0の階乗は(例外)1:

:ユーザーによって導入数は、次に0でない場合

if(n==0){ 
    return 1; 
} 

else { 
     int recurse = factorial(n-1); 
     int result = recurse*n; 
     return result; 
    } 
  1. この場合、たとえば、 2. recurse = factorial(2-1)で関数を呼び出し、関数の呼び出しが終了するまで待ちます(この場合、同じ関数を呼び出しますが、問題はありません。関数呼び出しが終了するまで待ってください)。したがって、ファクター(2-1)を呼び出します。したがって、継続する...

  2. 階乗(1)、n==0、else文の中に入ります。コールファクタial(1-1)。もう一度関数階乗(1-1)が終了するまで待つ。したがって、継続する...

  3. 階乗(0)、n==0return 1。関数の呼び出しが終了したら、今度はステップ2を続行します。

  4. ステップ2のfactorial(1)を続ける:factorial(1-1)は1を返し、recurseに格納します。 int result = recurse * n結果= 1・1です。最後にこのステップでresult(1)を返します。今度は、階乗(1)コールでまだ待機しているステップ1に進みます。

  5. 手順1で階乗を続行します。階乗(2-1)は1を返します。recurseに格納します。 int result = recurse * n結果= 1・2です。そしてresult(2)を返します。

最後に階乗は(2)(3)、4、5、6、7、そして最終的にあなたが8階乗最も重要なことは、あなたが呼び出すとき、ということであることを理解します階乗について考え2.返します同じ関数をスタックに格納して終了するまで待機します。

関連する問題