2

ネストされた再帰関数からの return 呼び出しが main までどのように伝播するかを説明してください。

本で次のコード セグメントに出くわしました。printf の出力は '6, 12' です

再帰関数 sumdig() では、3 回目の再帰呼び出しで return ステートメントが呼び出されます。

sumdig() が 2 番目の再帰呼び出しに戻るとき、sumdig() は、return ステートメントではなく、式に評価される必要があります (つまり、sumdig(n) を返す)。

しかし、そうではないようです。再帰関数からの return 呼び出しは、main までずっと伝搬されています。

ネストされた再帰関数からの return 呼び出しが main までどのように伝播するかを誰か説明してもらえますか?

再帰呼び出しが「return sumdig(n)」のようなものであれば、以下のコードは私にとって意味のあるものでした。

main()
{

  int a, b;

  a = sumdig( 123 );
  b = sumdig( 123 );

  printf( "%d, %d\n", a, b);

}

sumdig(int n)
{
  static int s = 0;
  int d;

  if(n != 0)
  {
    d = n % 10;
    n = (n - d) / 10;
    s = s + d;

    sumdig(n);

  }
  else
    return(s);
}

Sumdig の再帰呼び出し

Initial call           :n = 123, s = 0
First recursive call   :n = 12,  s = 3
Second recursive call  :n = 1,   s = 5
Third recursive call   :n = 0,   s = 6   // Return statement happens here

同様に、2 番目の呼び出しでは、静的変数は 6 ずつ増加して 12 になります。

私の質問が明確でない場合は、改善にご協力ください。

4

3 に答える 3

1

あなたの質問自体に答えがあります。static 変数sは、条件が false の場合にのみ関数がメインに戻るときに、各再帰を更新しました。したがって、最後に更新されたsreturn to main の値。

于 2013-08-22T12:08:38.193 に答える
1

これは非常に古いスタイルの C です。関数からの戻り値は、関数の最後の評価の結果になります (この場合は sumdig())。

于 2013-08-22T11:58:59.003 に答える