
現在学校の課題で
プログラムを組んでるんですが
ちょっとよくわからないことがあるので教えてください
再起呼び出しの回数をカウントして
その回数を返したいのですが
例えば
coid honoi(int n,char a,char b,char c) {
int count=0;
if (n>0) {
hanoi(n-1,a,c,b);
count++;
}
}
のようなプログラムを組むと
hanoi(n-1,a,c,b)
を呼び出すと、countが再度 0 に戻され
count=1 になってしまいます。
同様に
if() {
int count=0;
hanoi();
count++
}
としても、count=1のままでした。
再起呼び出しをするたびに、この count値を増やしていくには
どのようにプログラムを書けばよいのでしょうか?
まだCは初心者レベルなので
易しめにご説明ください。
よろしくお願いします。
No.1ベストアンサー
- 回答日時:
関数の外で変数を宣言し、どこかで初期化して、カウントアップすれば実現できます。
static int count;
:
:
int main(int argc, char *argv[]) {
:
:
count = 0;
hanoi(適当な引数);
:
:
}
void hanoi(int n,char a,char b,char c) {
count++;
if (n>0) {
hanoi(n-1,a,c,b);
}
}
こんな感じです。
main関数で宣言することで
実現することができました。
"static"を付けた宣言ついては、
まだ勉強不足なので
もう少し勉強しようと思います。
ありがとうございました。
No.3
- 回答日時:
普通は呼び出された側でカウントするのではなく、呼び出す側でカウントするのがいいですが・・・。
方法としては、グローバル変数(関数の外にある変数で、どの関数からでも使用できる)を使うか、メイン関数で使うかです。
また、メイン関数で使う場合にも、条件判断(ループ)内で初期化してはカウントする意味がないので、初期化は必ず初め(遅くても直前)に行います。
プログラムにすると、たとえば、
int count=0;
int main()
{
honoi(...);
}
void honoi(...)
{
count++;
}
であったり、または、
int main()
{
int count=0 ;
while(...)
{
honoi(...);
count++;
};
}
void honoi(...)
{
...
}
などとなります。
main関数内で宣言するのが
簡単だったので
その方法で実現できました。
グローバル変数も上手く使いこなせるように
頑張ります。
ありがとうございました。

No.2
- 回答日時:
ハノイの塔ですねー、懐かしいです。
変数のスコープについてはご存知でしょうか?
変数にはグローバル変数とローカル変数の2種類があり、
#include <stdio.h>
int a /*これはグローバル変数*/
void hoge(void)
{
int b /*これはローカル変数*/
}
main()
{
int c /*これはローカル変数*/
void hoge();
}
となります。ローカル変数はその関数が終了すればメモリーから解放され、逆にグローバル変数はプログラムが終了したらメモリーから解放されます。つまりstar_blueさんのcount変数はhanoi関数が終了したらメモリーから消されるので、count値が増えていきません。グローバルにcountを宣言されるか、hanoi関数内でstatic int count =0;と宣言すれば大丈夫でしょう。
ちなみにグローバル変数は0で初期化されますのでint count c =0の=0は入りません。staticはプログラムが終了するまで値を保ちます。
実は課題はハノイの搭ではないんですが
持っていたCの本のサンプルプログラムが
ハノイの搭しか載ってなかったんです。
値が増えないのは毎回初期化されていると言うよりも
メモリーから消されるためなんですね。
勉強になりました。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
2の補数を計算するプログラム
-
16bitで乱数を生成する方法
-
階乗のプログラム
-
放射状ブラー C言語で書いたの...
-
OpenCVによる4値化について
-
C#で疑似カラー
-
最早開始時間と最遅完了時刻を...
-
C言語 エラーの原因がわからな...
-
信頼区間の1.96や1.65ってどこ...
-
「Aに対するBの割合」と「Aに対...
-
For文の終了値を関数にしても問...
-
配列をnビットシフトする
-
数学 一次関数 関数 y=-3/4x+k(...
-
std::set<int> で、ある値が何...
-
Enterキーを押されたら次の処理...
-
sscanfとscanfの違いがよくわか...
-
main.c:7:43: warning: implici...
-
#define _CRT_SECURE_NO_WARNIN...
-
InvokeMemberメソッドとは何を...
-
【#define】 defineで定義した...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語で簡単なパックマンゲーム...
-
2の補数を計算するプログラム
-
c言語プログラミングについて f...
-
再起呼び出しの回数をカウント...
-
intとlongは同じ?
-
openCVの画像処理について
-
C言語
-
【C#】SQL文の中に変数を埋め込...
-
C言語プログラミング 漸化式に...
-
カードシャッフルのブログラム...
-
C++ Debug Errorについて教えて
-
デバッグビルドとリリースビル...
-
迷路を脱出する経路探索プログ...
-
C++デバックエラーについて詳し...
-
C++ bmp 透過処理
-
複数の共有メモリの作成
-
C言語で%を使わない余りの出し方
-
C言語
-
2次関数プログラムを描写する...
-
16bitで乱数を生成する方法
おすすめ情報