正しい値を与えない再帰的メソッド

私は再帰的な方法を使用したいが、正しく動作させるのに問題がある。

たとえば、このプログラムでは、 b を表示すると、値は0でなく10ですか?

public static void main(String[] args) {
     int a = 0;

     int b = recursivMethod(a);
     System.out.println(b);
}

static int recursivMethod(int a)
{
    if(a != 10)
        recursivMethod(a+1);

    return a;
}
1
追加された 著者 Melvin Protacio,

8 答え

問題は、メソッドを再帰的に呼び出すが、その値を返すことではないということです。つまり、 recursivMethod を正しく呼び出した後、すぐに a の初期値を返します。代わりにこれを試してください:

public static void main(String[] args) {
    int a = 0;

    int b = recursivMethod(a);
    System.out.println(b);
}

static int recursivMethod(int a)
{
    if(a != 10)
        return recursivMethod(a+1); //here, you return the result of your recursive call

    return a; //instead of just immediately returning a, which should only be done only after a == 10
}
5
追加された

2点:

  1. When your method calls itself recursively, it's ignoring the returned value:

    if(a != 10)
       recursivMethod(a+1);//<--- did you mean to do something with the result?
    
  2. Since recursivMethod() doesn't change a, and returns a at the end, then calling recursivMethod(0) will return 0. This is exactly what happens when you run your code.

2
追加された
@ user1149157:いいえ、そうではありません。それぞれの呼び出しは a の独自のコピーを取得します。
追加された 著者 NPE,
私は+ 1でそれを呼び出しました!それは各呼び出しを増やします、いいえ?
追加された 著者 Mehdi,

これは、再帰呼び出しの戻り値を無視しているためです。

static int recursivMethod(int a) {
    if(a != 10)
        return recursivMethod(a+1);
    return a;
}
1
追加された

お試しください

return recursiveMethod(a+1);

代わりに

1
追加された

あなたは再帰呼び出しの結果を破棄しています。

static int recursivMethod(int a)
{
    if(a != 10)
        return recursivMethod(a+1);//Note the return

    return a;
}
1
追加された

メソッドローカル変数 a に新しい値を割り当てたことはありません。
試してください:

public static void main(String[] args) {
   int a = 0;

   int b = recursivMethod(a);
   System.out.println(b);
}

static int recursivMethod(int a)
{
  if(a != 10)
    a = recursivMethod(a+1);

  return a;
}
1
追加された
static int recursivMethod(int a)
{
if(a != 10)
    return recursivMethod(a+1);


}
0
追加された

行方不明:

return recursivMethod(a+1);
0
追加された