
現在学校の課題で
プログラムを組んでるんですが
ちょっとよくわからないことがあるので教えてください
再起呼び出しの回数をカウントして
その回数を返したいのですが
例えば
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も見ています
-
電子書籍プレゼントキャンペーン!
最大2万円超分当たる!マンガや小説が読める電子書籍サービス『Renta!』で利用できるギフトコードプレゼント実施中!
-
e^(x^2)の積分に関して
数学
-
c言語についての質問です。
C言語・C++・C#
-
while文について、c言語です。
C言語・C++・C#
-
4
c言語 16進数の2進数への変換
C言語・C++・C#
-
5
16進数から2進数へ
C言語・C++・C#
-
6
C言語における再帰呼び出しの限界?について
C言語・C++・C#
-
7
printf で二進表示を行いたい。
C言語・C++・C#
-
8
str系関数を使わずに二つの文字を結合する方法
C言語・C++・C#
-
9
構造体から平均点を求める方法
C言語・C++・C#
-
10
複数桁10進数の*桁目だけを抽出したい
C言語・C++・C#
-
11
積分で1/x^2 はどうなるのでしょうか?
数学
-
12
C言語のfor文です。 繰り返しの中で文字を一つずつ増やしていくやり方を教えてください for(i=
C言語・C++・C#
-
13
再帰プログラム
C言語・C++・C#
-
14
typedef enumの使い方を教えてください
C言語・C++・C#
-
15
リスト構造のソートで悩んでます。。。
C言語・C++・C#
-
16
関数から配列を返すには?
C言語・C++・C#
-
17
C#にて別クラスの関数を使いたい
C言語・C++・C#
-
18
エクセルで計算すると2.43E-19などと表示される。Eとは何ですか?
Windows Me・NT・2000
-
19
C言語 配列の長さの上限
C言語・C++・C#
-
20
*をユーザーが入力した数字の数だけ表示するプログラムの作り方を教えてください
C言語・C++・C#
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
人気Q&Aランキング
-
4
Cプログラムによる画像の高速フ...
-
5
関数とビット列
-
6
再起呼び出しの回数をカウント...
-
7
intとlongは同じ?
-
8
C++ bmp 透過処理
-
9
unsigned型のビット構成を表示...
-
10
C言語で簡単なパックマンゲーム...
-
11
再帰処理をループ処理に変換
-
12
argvのNULLチェック
-
13
C言語でif文が予想と違う動きを...
-
14
C言語の質問です if(a[0]>a[1]&...
-
15
C言語初心者です、、、お助けく...
-
16
数学『二次関数』 ②の問題なの...
-
17
std::set<int> で、ある値が何...
-
18
2÷3などの余りについて
-
19
C言語でdouble型の小数点の引き...
-
20
C言語での引数の省略方法
おすすめ情報
公式facebook
公式twitter