0

この例を理解するのに苦労しています。ある時点以降に実際に何が起こるかわかりません。

コードは次のとおりです。結果は 4 になるはずです。

何度か自分自身を呼び出していることがわかりますが、実際にどのようにして結果が 4 になるかは完全にわかりません。どんな助けでも大歓迎です。

#include <stdio.h>

int recursion(int i) 
{ 
  return (i>1 ? i - recursion(i/2) : 3);
} 

int main() 
{ 
  int number = 9; 
  printf("The result is %d\n", recursion(number)); 
  return 0;
}

編集: どうもありがとう、それですっきりしました!

4

6 に答える 6

5

here from code, recursion(1) = 3and i/2when i>1, 9/2 = 4(パラメーターとして int であるため)

この再帰関数の基本条件は次の場合です。i = 1 再帰は図で自分自身を説明しました]

于 2013-01-16T10:29:39.300 に答える
1

再帰とは、条件が真になるまで何度か繰り返すプロセスです。

ここで、関数 recursion は、i>1 が false の場合は値 3 を返し、true の場合は再帰的に呼び出します。

i=9 なので、最初に 9>1 をチェックすると true になります。したがって、i は int であるため、関数は 9 - 再帰 (9/2=4) を返します。

次に、recursion(4) 4>1 を呼び出します。したがって、4 を返します - recursion(4/2=2)

再び 2>1、2 を返します - recursion(1)

ここでも 1>1 は false で、上記の値に代入する必要がある 3 を返します。つまり、2-3 = -1 です。

4 - (-1) = 5

9 - 5 = 4。

于 2013-01-16T10:11:45.767 に答える
1

これを理解する最善の方法は、デバッガーでステップスルーすることだと思います。

于 2013-01-16T10:01:56.237 に答える
1

この問題については、置き換えて単純化することで推論できます。

recursion(9) の呼び出しから始めます。i を 9 に置き換えて、reduce します。

recursion(9)
->  9 > 1 ? 9 - recursion(9/2) : 3
->  true ? 9 - recursion(4) : 3
->  9  - recursion(4)

これrecursion(4)を簡単にするために、プロセスを繰り返すことができます...

recursion(4)
->  4 > 1 ? 4 - recursion(4/2) : 3
->  true  ? 4 - recursion(2) : 3
-> 4 - recursion(2)

recursion(2)
-> 2 > 1 ? 2 - recursion(2/2) : 3
-> true ? 2 - recursion(1) : 3
-> 2 - recursion(1)

recursion(1)
-> 1 > 1 ? ... : 3
-> false ? ... : 3
-> 3

ここで最終結果が得られたので、それを代入してrecursion(1)

2 - 3 -> -1

recursion(2)

4 - -1 -> 5

recursion(4)

9 - 5 -> 4
于 2013-01-16T10:05:42.280 に答える
0

再帰関数は、次のように簡潔に書くことができます。

int recursion(int i) 
{ 
    if(i>1)
    {
        int j;
        j = i - recursion(i/2); // note here that the function recall itself
                                // note also that as i is integer the function
                                // will be invoked with i/2 rounded to the lower int value
        return j;
    }
    else
    {
        return 3;
    }
}

お役に立てれば...

于 2013-01-16T10:19:59.837 に答える
0

呼び出しがどのように連鎖されているかを確認する必要があります。デバッグ出力は次のことに役立ちます。

int recursion(int i) 
{ 
   int result;
   printf( "called with i=%d\n", i );
   result = (i>1 ? i - recursion(i/2) : 3);
   printf( "call with i=%d will return %d\n", i, result );
   return result;
} 

基本的な考え方は、再帰呼び出しが行われると、再帰呼び出しが終了するまで元の呼び出しが中断されるというものです。

于 2013-01-16T10:02:54.677 に答える