0
public class recursion  {

    public static void main(String[] args)

    {
        thisclass(0);
    }

    public static void thisclass(int z)
    {
        int x = 1;
        int y = 3;
        if (z==10)
        {
            System.out.println("Done");
        }
        else
        {
            System.out.println(x/y);
            x++;
            y= y+2;
            thisclass(z++);
        }
    }

}

私は現在再帰を学んでいますが、thisclassメソッドのelseステートメントに到達すると、異常な量のゼロが出力された後にエラーが発生します。

私がプログラムに実行させたいのは、10 回実行し、Print 1/3 2/5 3/7 などの行に沿って何かを実行することです。

どこが間違っていますか?

4

5 に答える 5

4

この行:

thisclass(z++);

あなたが思っていることをしません。「z」をインクリメントしてから、z の元の値で thisclass を呼び出します。それは次のようにするのとよく似ています:

int temp = z;
z = z + 1;
thisclass(temp);

ここでは、ポストインクリメントの代わりにプリインクリメントを使用します。

thisclass(++z);

DrakenRabbit と Serdalis が投稿した回答も有効です。これらの変更をすべて行うまで、正しく動作しません。

于 2013-04-10T01:48:39.717 に答える
2

などをサポートしていない を0行っているため、これらすべてを取得しています。integer division1/3

を使用するようにコードを変更してfloat0問題を解決する必要があります。

例えば

float x = 1.0;
float y = 3.0;

yまた、各呼び出しでの値をリセットしているため、y常に3呼び出しの最初と5最後になります。の値をチェックして、 の値がどうあるべきかを確認するz必要yがあります。

の値についても同じことが言えますx

zが各呼び出しにあるため、呼び出しごとにのpost-incremented値がz増加しないため、呼び出しを次のように変更する必要があります。

thisclass(++z);

その価値を作るためにpre-incremented。そうしないと、この呼び出しは永遠に続きます。

thisclassまた、非常に紛らわしいので、メソッドを呼び出さないでください。

于 2013-04-10T01:47:16.767 に答える
1

else 条件で x と y をインクリメントしても、再帰呼び出し変数には影響しません。再帰は、同じメソッドへの新しい呼び出しと考えてください。そのため、再帰呼び出しを行うと、x と y は 1 と 3 に初期化されます。x と y をパラメーターとして渡すと、更新された値を各再帰呼び出しに渡すことができます。これについて行く1つの方法は...

お役に立てれば :)

于 2013-04-10T01:49:51.537 に答える
0

ノート:

  • 初期化には、再帰関数自体を呼び出す初期呼び出し関数を使用することをお勧めします

  • データを使用しstaticます。そうしないと、再帰呼び出しによって保持されません

  • recur(z++)recur(z)無限に繰り返されるように実行されます。recur(z+1)代わりに使用してください

コード:

public class recursion
{
    public static void main(String[] args)
    {
        startRecursive(0);
    }

    // using static data
    private static int x = 1, y = 3;

    // initial call
    public static void startRecursive (int initZ)
    {
        x = 1;
        y = 3;

        // avoid infinite recurrence
        if (initZ > 10) initZ = 0;

        recur(initZ);
    }

    // recursive function
    public static void recur(int z)
    {
        if (z == 10)
        {
            System.out.println("Done");
        }
        else
        {
            System.out.println(x/y);

            x += 1;
            y += 2;

            recur(z+1); // z++ will return z
        }
    }
}
于 2013-04-10T03:01:31.487 に答える