0

次のコードで例外が発生しないのはなぜですか? このコードを実行した後、test.fact(t.java:32) No Compile-Time Error was found で言及されている無限ループを取得しています。

class test
{

    int fact(int m) throws Exception
    {
        if (m==1)
        {
        return 1;
        }
    else
        return (fact ((m-1)*m));
    }
}

class main
{
    public static void main(String ar[]) throws Exception
    {
        test t = new test();
        System.out.println(t.fact(5));
    }
}

たとえば、私が使用していると言いながら

return(a+b); 

それは正常に実行され、エラーを表示する再帰の問題は何ですか???

4

3 に答える 3

3

ファクトメソッドの戻り値式に誤りがあります。そのはず

      return fact(m-1) * m;
于 2012-10-07T15:49:40.833 に答える
0

循環を使用して階乗を計算する別の方法 (再帰なし):

int fact(int m) throws Exception
{
    int f = 1;
    for (int i = 0; i < m; f *= ++i);
    return f;
}
于 2012-10-07T16:16:22.730 に答える
0
      return (fact ((m-1)*m));

returns

fact(20)

which returns

fact (380)

which returns

fact (379*380)

which ....

which never returns anything and should make a stack overflow (too much memory is used on the call stack).

           return fact(m-1) * m;

should work.

I highly recommend you reading again the basics, and examples ( here, for example - http://www.toves.org/books/java/ch18-recurex/index.html)

Try writing the recursion tree yoursels, in order to understand what happens.

于 2012-10-07T15:57:36.613 に答える