C言語関係掲示板

過去ログ

No.138.再帰関数中で別関数を呼ぶ


No.885

再帰について
投稿者---クマキチ(2002/01/19 02:32:56)


こんばんは、初めまして。
どうしてもわからないことがあるので、質問させていただきます。

再帰的に関数を呼び出し、値を返す途中で別の関数を呼び出すには
どうすればよいのでしょうか?(最後の呼び出しの戻り値を返したときに
別の関数を呼び出すようにしたいのです)
例えば関数 foo() を3回呼んだとすると、2回目の呼び出しに
戻ったときに関数 bar() を呼びたいのですが。。。
<small>
<pre>
#define APP 0
#define ABS 1
#define VAR 2

typedef struct{
:
}TERM;
static int tag = 0;

TERM *foo(TERM *sp){

if(APP){
sp = bar(); // bar() を呼び終了
tag = 1;
return sp;
}
else if(ABS){
sp = foo();
if(tag == 1){
baz(); tag = 0; // baz() を呼ぶ
}
return sp;
}
else if(VAR){
sp = foo();
if(tag == 1){
baz(); tag = 0; // baz() を呼ぶ
}
return sp;
}
else{
Error;
}
}
</small>
</pre>
上記のようなプログラムを書いたのですが、思ったとおりの結果が
でませんでした。

とてもわかりにくい質問だと思うのですが、
もしわかる方がいらっしゃればアドバイスをいただけますか?
よろしくお願いいたします。




No.887

Re:再帰について
投稿者---shu(2002/01/19 12:07:25)
http://c2c-1.rocketbeach.com/~finder_s/ccc/


>
>再帰的に関数を呼び出し、値を返す途中で別の関数を呼び出すには
>どうすればよいのでしょうか?(最後の呼び出しの戻り値を返したときに
>別の関数を呼び出すようにしたいのです)
>例えば関数 foo() を3回呼んだとすると、2回目の呼び出しに
>戻ったときに関数 bar() を呼びたいのですが。。。
>
>とてもわかりにくい質問だと思うのですが、
>もしわかる方がいらっしゃればアドバイスをいただけますか?
>よろしくお願いいたします。
>

再帰については、

http://www.bohyoh.com/

のページのアルゴリズム講座に詳しく説明されています。
ページを見るついでにアルゴリズム体験学習プログラムのダウンロードしておくと良いでしょう。



No.924

ありがとうございました m(_ _)m
投稿者---クマキチ(2002/01/24 17:59:02)



こんにちは、クマキチです。
shuさん、ともじさん、お返事を頂きありがとうございました。
お礼を言うのが遅くなってしまい、すみません。

お二人からの投稿を読み、もう一度考え直したところ
無事解決しました。(´▽`)
本当にありがとうございました。







No.892

Re:再帰について
投稿者---ともじ(2002/01/19 18:50:35)


こんばんは。

>再帰的に関数を呼び出し、値を返す途中で別の関数を呼び出すには
>どうすればよいのでしょうか?(最後の呼び出しの戻り値を返したときに
>別の関数を呼び出すようにしたいのです)
>例えば関数 foo() を3回呼んだとすると、2回目の呼び出しに
>戻ったときに関数 bar() を呼びたいのですが。。。

呼び出し回数をカウントする引数を一緒に渡してやり、
その引数を関数呼び出しのタイミングでデクリメントすれば、
今、何度目の呼び出しかわかるのではないでしょうか。


#include <stdio.h>
#define APP 0
#define ABS 1
#define VAR 2

typedef struct{
	int dummy;
}TERM;
static int tag = 0;

/* dummy */
void baz(void)
{
}

/* dummy */
TERM *bar(TERM *sp)
{
	printf("bar\n");
	return sp;
}

TERM *foo(TERM *sp,int i){

	if(i==APP){
		printf("APP\n");
		sp = bar(sp); // bar() を呼び終了

		tag = 1; 
		return sp;
	}
	else if(i==ABS){
		printf("ABS\n");
		sp = foo(sp,--i);
		if(tag == 1){
			baz(); tag = 0; // baz() を呼ぶ
		}
		return sp;
	}
	else if(i==VAR){
		printf("VAR\n");
		sp = foo(sp,--i);
		if(tag == 1){
			baz(); tag = 0; // baz() を呼ぶ
		}
		return sp;
	}
	else {
		printf("else\n");
		return NULL;
	}
}

int main(void)
{
	TERM	term,*p;

	p = foo(&term,2);

	return 0;
}


戻る


「初心者のためのポイント学習C言語」 Last modified:2002.02.03
Copyright(c) 2000-2002 TOMOJI All Rights Reserved