2007/12/06(Thu) 07:09:47 編集(投稿者)
■No11054 (学習中 さん) に返信
> 少し変えさせてください
> お願い致します。再帰処理で回しているi j kを使うのでなにか変化をさせないと計算できない気がします。
> そこら辺がわかりませんお願いします
これも同じで、次の関数に渡すための情報をくくりだせばいいだけです。
void A( int depth ) {
for ( int i=1; i<=9; i++ )
B(depth - 1, i);
}
void B( int depth, int val ) {
if ( depth<=0 ) {
Console.WriteLine(val);
return;
}
for ( int i=1; i<=9; i++ )
B(depth-1, val * i );
Console.WriteLine(Environment.NewLine);
}
おそらく、
「i*j*kじゃなくて、i-j+kの場合はどうするんだ」とか
「i,j,k全部の情報がほしい」とか、
そう言うかと思うんですが。
その場合は情報が可変長で、可変長のデータを関数に渡すときは、
可変長のデータを扱えるオブジェクトを使って情報を渡します。
再帰関数であってもそうでなくても同じです。
void A( int depth ) {
for ( int i = 1; i <= 9; i++ )
B(depth-1, new int[] {i});
}
void B( int depth, int[] counter ) {
if ( depth<=0 ) {
int r=1;
for( int i=0; i<counter.Length; i++) r*=counter[i];
Console.WriteLine(r);
return;
}
int[] counter2 = new int[counter.Length+1];
for ( int i=0; i<counter.Length; i++) counter2[i]=counter[i];
for ( int i=1; i<=9; i++ ) {
counter2[counter.Length] = i;
B(depth-1, counter2 );
}
Console.WriteLine(Environment.NewLine);
}
私なら単純な再帰はうるさいので展開します。
void A( int depth ) {
int counter[depth];
for ( i=0; i<depth; i++ ) counter[depth] = 1;
while ( i<depth ) {
int i=0;
for ( i=0; i<depth, ++counter[i]<=9; counter[i]=0, i++ )
Console.WriteLine(Environment.NewLine);
if ( i>=depth ) break;
int r=1;
for ( i=0; i<depth; i++ ) r*=counter[i];
Console.WriteLine(r);
}
}
#全てのコードは動作確認してません。