C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: for文を自動生成関数


(過去ログ 24 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■11050 / inTopicNo.1)  for文を自動生成関数
  
□投稿者/ 学習中 (1回)-(2007/12/05(Wed) 23:39:46)

分類:[C#] 

2007/12/06(Thu) 21:53:05 編集(投稿者)

ミス
引用返信 編集キー/
■11051 / inTopicNo.2)  Re[1]: for文を自動生成関数
□投稿者/ れい (261回)-(2007/12/06(Thu) 00:19:23)
2007/12/06(Thu) 00:19:36 編集(投稿者)
No11050 (学習中 さん) に返信
> 引数が2の場合、下記コードを自動で生成する関数を作成したいです。

本当に「コードを生成する関数」を作りたいのでしょうか?
「下記のコードのように振舞う関数」を作りたいのではないですか?

前者なら出力方法がわからないと答えられません。
ファイルでいいのか、デザイナに出力させたいのか、Expressionで使いたいのか、とか。

後者の場合、
再帰を使う方法と使わない方法とあります。
再帰でやりたいなら以下のように深さを付けて再帰すればできます。

void recursivefunction( int depth ) {
  if ( depth == 0 ) {
    //何らかの処理
    return;
  }
  for ( int i = 0; i < 9; i++ ) {
    recursivefunction(depth - 1);
  }
}

再帰でやらない場合は普通に配列に変数入れて
ぐるぐる回すだけでOKですね。

引用返信 編集キー/
■11054 / inTopicNo.3)  Re[2]: for文を自動生成関数
□投稿者/ 学習中 (2回)-(2007/12/06(Thu) 01:12:13)
2007/12/06(Thu) 21:53:58 編集(投稿者)
ミス

引用返信 編集キー/
■11060 / inTopicNo.4)  Re[3]: for文を自動生成関数
□投稿者/ れい (262回)-(2007/12/06(Thu) 07:09:20)
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);
  }
}

#全てのコードは動作確認してません。

引用返信 編集キー/
■11083 / inTopicNo.5)  Re[4]: for文を自動生成関数
□投稿者/ R・田中一郎 (2回)-(2007/12/06(Thu) 16:28:04)
R・田中一郎 さんの Web サイト
2007/12/06(Thu) 16:33:25 編集(投稿者)

>再帰について学習がしたいためご教授お願いします。

再帰処理についての課題かなにかじゃなかろうか・・・

void main() {
  this.HogeHoge(2, 1); // 2重ループの場合
  this.HogeHoge(3, 1); // 3重ループの場合
}

void HogeHoge(int stackPoint, int counter) {
  --stackPoint;
  for(int i = 1; i <= 9; ++i) {
    if (stackPoint> 0) {
      this.HogeHoge(stackPoint, i * counter);
    }
    else {
      Console.WriteLine(i * counter);
    }
  }
  if (stackPoint == 0) Console.WriteLine(Environment.NewLine);
}

みたいな^^;
#書き殴っただけでデバッグしてないです。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -