4 返信 最新の回答 日時: Aug 17, 2011 12:55 AM ユーザー:jintakatomoz

    組み合わせ

    jintakatomoz

      タイトル

      組み合わせ

      フォーラムに投稿

      Let関数を使って

      ABCDEFGの7項目から4つを選んだ組み合わせを作るにはどうしたら良い

      ABCD

      ABCE

      ABCF

      と、こんな具合に全ての組み合わせを作りたいのです

      Pro11 MacOSX10.6

        • 1. Re: 組み合わせ
          hiro_

           > Let関数を使って
          とは再帰計算のことかと思いますが、FM関数による再帰計算はおおよそ300回程度が計算限界で、今回の840通りの組み合わせ計算は出来ません。
          また、4階層入れ子の再帰計算(FM関数による)は非常に複雑なものとなり記述困難かと思います。

          4段ループスクリプトで宜しければ、以下で出来ます。
          (「テーブル::要素文字列フィールド」は「ABCDEFG」要素文字列の入力フィールド、「テーブル::組み合わせ一覧フィールド」は結果を書き込むフィールドで、結果は一覧リストとして書き出します。)

          ・ 変数を設定 [$候補1; 値:テーブル::要素文字列フィールド]
          ・ 変数を設定 [$回数1; 値:1] 
          ・ 変数を設定 [$組み合わせ一覧; 値:""]
          ・ Loop 
          ・  Exit Loop If [$回数1>Length($候補1)]
          ・  変数を設定 [$文字1; 値:Middle($候補1;$回数1;1)] 
          ・  変数を設定 [$候補2; 値:Substitute($候補1;[$文字1;""])]
          ・  変数を設定 [$回数2; 値:1] 
          ・  Loop
          ・   Exit Loop If [$回数2>Length($候補2)] 
          ・   変数を設定 [$文字2; 値:Middle($候補2;$回数2;1)]
          ・   変数を設定 [$候補3; 値:Substitute($候補2;[$文字2;""])] 
          ・   変数を設定 [$回数3; 値:1]
          ・   Loop 
          ・    Exit Loop If [$回数3>Length($候補3)]
          ・    変数を設定 [$文字3; 値:Middle($候補3;$回数3;1)] 
          ・    変数を設定 [$候補4; 値:Substitute($候補3;[$文字3;""])]
          ・    変数を設定 [$回数4; 値:1] 
          ・    Loop
          ・     Exit Loop If [$回数4>Length($候補4)] 
          ・     変数を設定 [$文字4; 値:Middle($候補4;$回数4;1)]
          ・     変数を設定 [$組み合わせ一覧; 値:List($組み合わせ一覧; $文字1 & $文字2 & $文字3 & $文字4)] 
          ・     変数を設定 [$回数4; 値:$回数4+1]
          ・    End Loop 
          ・    変数を設定 [$回数3; 値:$回数3+1]
          ・   End Loop 
          ・   変数を設定 [$回数2; 値:$回数2+1]
          ・  End Loop 
          ・  変数を設定 [$回数1; 値:$回数1+1]
          ・ End Loop 
          ・ フィールド設定 [テーブル::組み合わせ一覧フィールド; $組み合わせ一覧] 

          なお、要素文字列内に重複文字は含まれていないものとします。

          • 2. Re: 組み合わせ
            jintakatomoz

            重複しないので35通りだと思いますが...

            (7*6*5*4)/(4*3*2)=35

            説明不足で申し訳ないです

            でも、勉強に成ります

            • 3. Re: 組み合わせ
              hiro_

              > 重複しないので35通りだと思いますが...
              >   (7*6*5*4)/(4*3*2)=35
              4文字列内の位置関係は不問で、単に文字重複しないという意味でしたか、
              なら、以下のステップの式を変更すればOKです。

              ・ 変数を設定 [$組み合わせ一覧; 値:List($組み合わせ一覧; $文字1 & $文字2 & $文字3 & $文字4)]

              ・ 変数を設定 [$組み合わせ一覧; 値: 下記式に変更]

               Let([
                $文字列=$文字1 & $文字2 & $文字3 & $文字4;
                 $文字列=Filter(テーブル::要素文字列フィールド;$文字列);
                  $文字列=Case(PatternCount($組み合わせ一覧;$文字列)=0; $文字列)
               ];
                List($組み合わせ一覧; $文字列)
               )

              • 4. Re: 組み合わせ
                jintakatomoz

                大変助かりました

                ありがとうございます