-3

重複の可能性:
このコードで実際に何が起こっているのですか?

再帰関数を含むコードがあります。私は再帰に多くの時間を浪費しました、しかし私はまだそれを得ることができませんでした、本当に:

#include<stdio.h>

count(int);

 main(){
   int x=10,z;
   z=count(x);
}  
count(int m){
   if(m>0)
      return count(m-1);
}

count引数を指定して初めて呼び出されると10、条件が満たされ、再帰が開始されます。関数がそれ自体を呼び出すと、実際に何が起こりますか?理解できません。ステートメントreturn count(m-1)はどういう意味ですか?コントロールをどこに転送しますか?

4

4 に答える 4

5

counttrueの場合、デフォルトの戻り値がないため、関数の戻り値は未定義(m <= 0)です。

C11、§6.9.1関数の定義

関数}を終了するに到達し、関数呼び出しの値が呼び出し元によって使用される場合、動作は未定義です。

さらに、再帰関数がどのように機能するかを理解するには、紙を取り、自分でコードを実行してみる必要があります(ここも参照)。

于 2012-09-04T14:50:31.827 に答える
1

countのときに何かを返す必要がありますm <= 0。の戻り型を宣言し、countでコンパイルし-Wallて、コンパイラがコードの間違いを見つけるのに役立つようにする必要があります。

于 2012-09-04T14:50:01.403 に答える
0

再帰とは、末尾再帰の場合、関数がそれ自体を呼び出すことを意味します。ほとんどの場合、関数はそれ自体の最後に呼び出されます。

したがって、count関数は、入力引数が> 0であることを確認し、そうである場合は、を呼び出しますcount(m-1)count これで、m=9の先頭から始まります。同じことを行い、m=8などでcountを呼び出します。

終了条件に達するまで。これは通常、関数などで明示的に対応する必要がありますif (m == 0) return m; 。その時点で再帰が終了し、関数が終了します。

また、count 次のような返品タイプが必要です。int count (int m)

于 2012-09-04T14:51:10.470 に答える
0

ステートメントreturncount(m-1)はどういう意味ですか?コントロールをどこに転送しますか?

それがあなたの唯一の質問のようです。

これは、値m-1で「カウント」を呼び出していることを意味します。したがって、mが10の場合、9で「カウント」を呼び出しています。

制御を再帰的にcountメソッドに転送しています。

また、「count」メソッドで可能なすべてのパスを返すこともできません。mが<=0の場合はどうなりますか?

于 2012-09-04T14:51:24.663 に答える