新しく発言する EXIT インデックスへ
for~next多段ネストを使わない試行

  for~next多段ネストを使わない試行 ede2002 2003/06/06 11:29:12 
  最終的にはn×mの配列で作業したいので、 ede2002 2003/06/06 12:16:04 
   └やりたいことは, 白石和夫 2003/06/06 16:34:37 
    └テストルーチンを外部副プログラムにするの... 白石和夫 2003/06/06 16:55:28 
     └やはり2進数的に計算するしかありませんか。... ede2002 2003/06/06 17:14:36 
      └2進数を使うしかないということはないと思い... 白石和夫 2003/06/06 20:38:22 
       └1次元配列で書けば, 白石和夫 2003/06/07 08:56:31 
        └2次元でやるとこうですか? ede2002 2003/06/08 16:27:36 
         └どうやらスピードはこちらのほうが格段に速... ede2002 2003/06/08 16:35:49 
          └残念ですが,FullBASICの利用者定義関数で結... 白石和夫 2003/06/08 17:05:56 
           └結果として配列値がほしいときは,副プログ... 白石和夫 2003/06/08 17:15:01 
            └ありがとうございました。 ede2002 2003/06/08 17:34:54 

  for~next多段ネストを使わない試行 ede2002 2003/06/06 11:29:12  ツリーへ

for~next多段ネストを使わない試行 返事を書く
ede2002 2003/06/06 11:29:12
5×5の配列の各要素に0か1が入るとして、全通りをスーパーネスト(造語です)を使わずに試す方法ってありますか?

今のところfor~nextを25回入れ子にするか、配列を書き出したものが2進数になることを利用するといった程度しか思いつかきません。
for j=1 to 5
for k=1 to 5
for l=0 to 1
A(j,k)=l
~
next l
next k
next j
では全通りにならないと思うのですが勘違いでしょうか。

  最終的にはn×mの配列で作業したいので、 ede2002 2003/06/06 12:16:04  ツリーへ

Re: for~next多段ネストを使わない試行 返事を書く
ede2002 2003/06/06 12:16:04
最終的にはn×mの配列で作業したいので、
入れ子にするという方法では対応ができないというのが理由です。
ネストを書くのがめんどくさい、デバッグが大変ということもありますが。

   └やりたいことは, 白石和夫 2003/06/06 16:34:37  ツリーへ

Re: 最終的にはn×mの配列で作業したいので、 返事を書く
白石和夫 2003/06/06 16:34:37
やりたいことは,
100 LET m=4
110 LET n=3
120 DIM x(m,n)
130 FOR a=0 TO 2^(m*n)-1
140 FOR i=1 TO m
150 FOR j=1 TO n
160 LET k=n*(i-1)+(j-1)
170 LET x(i,j)= MOD(INT(a/2^k),2)
180 NEXT j
190 NEXT i
200 CALL test
210 NEXT a
220 SUB test
230 MAT PRINT x;
240 END SUB
250 END
ということでしょうか?

    └テストルーチンを外部副プログラムにするの... 白石和夫 2003/06/06 16:55:28  ツリーへ

Re: やりたいことは, 返事を書く
白石和夫 2003/06/06 16:55:28
テストルーチンを外部副プログラムにするのであれば,
100 DECLARE EXTERNAL SUB test
110 LET m=4
120 LET n=3
130 DIM x(m,n)
140 FOR a=0 TO 2^(m*n)-1
150 FOR i=1 TO m
160 FOR j=1 TO n
170 LET k=n*(i-1)+(j-1)
180 LET x(i,j)= MOD(INT(a/2^k),2)
190 NEXT j
200 NEXT i
210 CALL test(x)
220 NEXT a
230 END
240 EXTERNAL SUB test(x(,))
250 MAT PRINT x;
260 END SUB
みたいな感じになります。250行に実際のテストを書いてください。
なお,上記をそのまま実行するとかなりの時間がかかりますが,時間がかかるのはMAT PRINT文です。画面表示を止めれば速くなります。

     └やはり2進数的に計算するしかありませんか。... ede2002 2003/06/06 17:14:36  ツリーへ

Re: テストルーチンを外部副プログラムにするの... 返事を書く
ede2002 2003/06/06 17:14:36
やはり2進数的に計算するしかありませんか。

副プログラムに配列をわたせるとは思いませんでした。勉強になります。

      └2進数を使うしかないということはないと思い... 白石和夫 2003/06/06 20:38:22  ツリーへ

Re: やはり2進数的に計算するしかありませんか。... 返事を書く
白石和夫 2003/06/06 20:38:22
2進数を使うしかないということはないと思います。

       └1次元配列で書けば, 白石和夫 2003/06/07 08:56:31  ツリーへ

Re: 2進数を使うしかないということはないと思い... 返事を書く
白石和夫 2003/06/07 08:56:31
1次元配列で書けば,
100 LET m=6
110 DIM a(m)
120 CALL try(1)
130 SUB try(k)
140 IF k>m THEN
150 MAT PRINT a;
160 ELSE
170 LET a(k)=0
180 CALL try(k+1)
190 LET a(k)=1
200 CALL try(k+1)
210 END IF
220 END SUB
230 END

        └2次元でやるとこうですか? ede2002 2003/06/08 16:27:36  ツリーへ

Re: 1次元配列で書けば, 返事を書く
ede2002 2003/06/08 16:27:36
2次元でやるとこうですか?
なるほど、鮮やかなものですね。精進せねば...
let m=3
let n=2
dim a(m,n)
mat a=zer
call try(1,1)

sub try(j,k)
if k>n then
call test
else
if j>m then
call try(1,k+1)
else
LET a(j,k)=0
call try(j+1,k)
LET a(j,k)=1
call try(j+1,k)
end if
end if
end sub

sub test
mat print a
end sub

end

         └どうやらスピードはこちらのほうが格段に速... ede2002 2003/06/08 16:35:49  ツリーへ

Re: 2次元でやるとこうですか? 返事を書く
ede2002 2003/06/08 16:35:49
どうやらスピードはこちらのほうが格段に速いようです。

ふと思ったのですが、関数に配列を渡せるなら、配列を返す関数というものは作成可能でしょうか?

          └残念ですが,FullBASICの利用者定義関数で結... 白石和夫 2003/06/08 17:05:56  ツリーへ

Re: どうやらスピードはこちらのほうが格段に速... 返事を書く
白石和夫 2003/06/08 17:05:56
残念ですが,Full BASICの利用者定義関数で結果を配列にすることはできません。

           └結果として配列値がほしいときは,副プログ... 白石和夫 2003/06/08 17:15:01  ツリーへ

Re: 残念ですが,FullBASICの利用者定義関数で結... 返事を書く
白石和夫 2003/06/08 17:15:01
結果として配列値がほしいときは,副プログラムの引数として結果を入れたい配列を渡し,その配列を書き換えることで代用します。
(Full BASICでは,副プログラムと絵定義の配列引数は参照渡しです)

            └ありがとうございました。 ede2002 2003/06/08 17:34:54  ツリーへ

Re: 結果として配列値がほしいときは,副プログ... 返事を書く
ede2002 2003/06/08 17:34:54
ありがとうございました。

こうやって丁寧に答えてくれるというのはとてもありがたいです。
まだまだだなぁ、俺は。


インデックスへ EXIT
新規発言を反映させるにはブラウザの更新ボタンを押してください。