
現在学校の課題で
プログラムを組んでるんですが
ちょっとよくわからないことがあるので教えてください
再起呼び出しの回数をカウントして
その回数を返したいのですが
例えば
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も見ています
-
c言語 16進数の2進数への変換
C言語・C++・C#
-
C言語初心者です、、、お助けください
C言語・C++・C#
-
C言語における再帰呼び出しの限界?について
C言語・C++・C#
-
-
4
プログラミングが分かりません。
C言語・C++・C#
-
5
間接参照のレベルが異なっています
C言語・C++・C#
-
6
構文エラー;"が型の前にありませんとは、どうしたら解決できるのですか。"
C言語・C++・C#
-
7
C言語初心者の質問失礼します。
C言語・C++・C#
-
8
c言語についての質問です。
C言語・C++・C#
-
9
C言語 エラーの原因がわからないので,見てほしいです
C言語・C++・C#
-
10
C言語初心者 ポインタについて、お助けください、、
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【C#】SQL文の中に変数を埋め込...
-
3のつく数と3の倍数を表示 C言語
-
C言語でDOS画面のプログラム(...
-
カードシャッフルのブログラム...
-
C言語
-
クリックされた地点が2点の線分...
-
画面に文字を表示
-
C言語の問題
-
C言語 サイコロ 2つの値を返せない
-
C言語のプログラムについて(...
-
rand()の乱数は何故良くないの?
-
2の補数を計算するプログラム
-
C言語で%を使わない余りの出し方
-
c言語の問題
-
C++で表を作成したいのです ...
-
「Aに対するBの割合」と「Aに対...
-
DWORDの実際の型は何でしょうか
-
Enterキーを押されたら次の処理...
-
「指定されたキャストは有効で...
-
Aの値からBの値を除するとは??
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語で%を使わない余りの出し方
-
カードシャッフルのブログラム...
-
2の補数を計算するプログラム
-
OpenCVによる4値化について
-
ヒストグラム均等化処理プログラム
-
【C#】SQL文の中に変数を埋め込...
-
再起呼び出しの回数をカウント...
-
intとlongは同じ?
-
C++で表を作成したいのです ...
-
画像の拡大・縮小
-
argvのNULLチェック
-
c言語プログラミングについて f...
-
ヌメロンのプログラム
-
OpenGLの惑星プログラム
-
C言語でDOS画面のプログラム(...
-
opencvとmbedのシリアル通信で...
-
C言語プログラミング 漸化式に...
-
3のつく数と3の倍数を表示 C言語
-
猫でもわかるゲームプログラミ...
-
C言語のプログラムについて(...
おすすめ情報