第15講 関数の再帰的呼び出し
第1話 順列の作成

再帰的呼び出しとは何かの説明の前に、
順列をfor文で作成することを考えてみましょう。
for文と対比すると、関数の再帰的呼び出しがいかに便利か分かるからです。
話を簡単にするために1から3の順列を作成する場合を考えてみましょう。

この順列は

の6個です。
さて、皆さん新規プロジェクトを作り、次のようなフォームを用意して、

実行結果が

となるようなソフトを作成してください。
初心者の方には、かなり難解だと思います。
是非とも頑張って、考えてください。
模範解答例は20行下。



















模範解答例
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
         String^ w;
         int i,j,k,l,h1,h2,s=0;
         int a[3];
         for(i=0;i<3;i++){
           a[0]=i+1;
           for(j=0;j<3;j++){
             a[1]=j+1;
             h1=1;
             if(a[0]==a[1])h1=0;
             if(h1==1){
               for(k=0;k<3;k++){
                 a[2]=k+1;
                 h2=1;
                 for(l=0;l<2;l++){
                   if(a[l]==a[2]){
                     h2=0;
                     break;
                   }
                 }
                 if(h2==1){
                   w+=a[0].ToString()+L" "+a[1].ToString()+L" "+a[2].ToString()+L"\n";
                   s++;
                 }
               }
             }
           }
         }
         w+=L"\n"+L"順列個数:"+s.ToString();
         label1->Text=w;
       }


(コピーペースト用


private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
String^ w;
int i,j,k,l,h1,h2,s=0;
int a[3];
for(i=0;i<3;i++){
a[0]=i+1;
for(j=0;j<3;j++){
a[1]=j+1;
h1=1;
if(a[0]==a[1])h1=0;
if(h1==1){
for(k=0;k<3;k++){
a[2]=k+1;
h2=1;
for(l=0;l<2;l++){
if(a[l]==a[2]){
h2=0;
break;
}
}
if(h2==1){
w+=a[0].ToString()+L" "+a[1].ToString()+L" "+a[2].ToString()+L"\n";
s++;
}
}
}
}
}
w+=L"\n"+L"順列個数:"+s.ToString();
label1->Text=w;
}





どうでしょうか。難しかったでしょう。
もしできなかったとしても、悲観することはありせんよ。
プログラム歴20年の私でも結構苦労しましたから。
さらに、ソースを見てもチンプンカンプンであるというのが正直なところではないでしょうか。
結構ベテランな方でも?が浮かんでいる方も大勢いらっしゃると思いますよ。
難解なソースを初心者の方にも分かるように第2話以降で詳しく解説していきますので、
乞うご期待!


第11講第6話へ
 第12講第1話へ 第14講第10話へ 第15講第2話へ


VC++講義第1部へ
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座