
下記が、組み合わせを求めるプログラムです。
これのどこを変更すれば、順列を列挙するプログラムになりますか(ただし、重複順列でない。例、5P2=5*4=20通り)?教えていただけませんか?
Public Class Form1
Dim w0, w1, count As String
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Me.Text = "コンビネーションサーチ"
Label1.Text = "個の中から"
Label2.Text = "個とる組リスト"
Button1.Text = "計算"
TextBox1.Text = "6"
TextBox2.Text = "3"
TextBox3.Text = ""
TextBox3.ScrollBars = ScrollBars.Vertical
count = 0
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim n, m As Integer
n = TextBox1.Text
m = TextBox2.Text
w1 = " }"
w0 = "{ "
TextBox3.Text = ""
count = 0
combisearch(1, n, m)
MsgBox("組み合わせ個数は、" & count & "個です。")
End Sub
Sub combisearch(ByVal st, ByVal ed, ByVal depth)
Dim i, temp
If depth - 1 < 1 Then
For i = st To ed
TextBox3.Text &= w0 & i & w1 & vbCrLf
count += 1
Next
Else
For i = st To ed
temp = w0
w0 &= i & " "
combisearch(i + 1, ed, depth - 1)
w0 = temp
Next
End If
End Sub
End Class

No.5ベストアンサー
- 回答日時:
ANo2~5です。
すいませんが、これまでのは、廃棄願います。
Public Class Form1
Dim w0, w1, count As String
dim w2 As String '★追加
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Me.Text = "コンビネーションサーチ"
Label1.Text = "個の中から"
Label2.Text = "個とる組リスト"
Button1.Text = "計算"
TextBox1.Text = "6"
TextBox2.Text = "3"
TextBox3.Text = ""
TextBox3.ScrollBars = ScrollBars.Vertical
count = 0
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim n, m As Integer
n = TextBox1.Text
m = TextBox2.Text
w1 = " }"
w0 = "{ "
TextBox3.Text = ""
count = 0
combisearch(1, n, m)
MsgBox("組み合わせ個数は、" & count & "個です。")
End Sub
Sub combisearch(ByVal st, ByVal ed, ByVal depth)
Dim i, temp
If depth - 1 < 1 Then
For i = 1 To ed '★置き換え
'For i = st To ed
If InStr(w2, CStr(i) & " ") = 0 Then '★追加:重複の除外
TextBox3.Text &= w0 & i & w1 & vbCrLf
count += 1
End If '★追加
Next
w2 = "" '★追加
Else
For i = 1 To ed '★置き換え
'For i = st To ed
If InStr(w2, CStr(i) & " ") = 0 Then '★追加:重複の除外
temp = w0
w0 &= i & " "
w2 = w2 & i & " " '★追加
combisearch(i + 1, ed, depth - 1)
w0 = temp
w2 = temp '★追加
End If '★追加
Next
End If
End Sub
End Class
## EXCEL VBAで試しているので
## 書き換えでミスばっかりしてすいません。
5P4=120
と
5P2=20
がうまくいっていたのでたぶん大丈夫かと。
今まで、ご回答ありがとうございました。
おかげさまで、見事順列列挙プログラムが完成しました。
また、プログラムのことで何か困ったことがあれば、ご回答お願いいたします。
No.4
- 回答日時:
あっ、すいません。
combisearch(1, ed, depth - 1 , i)
です。
でも、depth = 2 のときうまくいくはずですが、
depth >2 のときに問題があることに気づいたのでちょっと考え直して改めて回答いれます。
No.3
- 回答日時:
ANo.2です。
>補足
>この方法では、重複順列を許しております。
大変失礼しました。
うっかりミスしていました。
以下の例のようにサブルーチンに除外する数字を渡すことで対応できると思います。
注:-999999999は除外する数字はないという意味。
・・・
combisearch(1, n, m,-999999999)
'combisearch(1, n, m)
MsgBox("組み合わせ個数は、" & count & "個です。")
End Sub
Sub combisearch(ByVal st, ByVal ed, ByVal depth,ByVal myVal)
'Sub combisearch(ByVal st, ByVal ed, ByVal depth)
Dim i, temp
If depth - 1 < 1 Then
For i = st To ed
if i <> myVal then '追加:重複の除外
TextBox3.Text &= w0 & i & w1 & vbCrLf
count += 1
end if '追加
Next
Else
For i = st To ed
if i <> myVal then '追加:重複の除外
temp = w0
w0 &= i & " "
'ここだけ。
combisearch(1, ed, depth - 1)
'combisearch(i + 1, ed, depth - 1)
w0 = temp
end if '追加
Next
End If
End Sub
この回答への補足
2回目のご回答ありがとうございます。
しかし、
permsearch(1, ea, deptha - 1)
の部分で、下記のエラーが出ます。
誠に申し訳ありませんが、どう対処すればよいでしょうか。
教えていただけませんでしょうか。
エラーメッセージ内容 ここから
エラー1
説明:'Public Sub permsearch(sa As Object, ea As Object, deptha As Object, myVal As Object)' のパラメーター 'myVal' に対して引数が指定されていません。
ファイル:G:\順列 & 組み合わせ探索\順列 組み合わせ探索\順列 組み合わせ探
索\Form1.vb
行:150
列:21
プロジェクト:順列 組み合わせ探索
ここまで
なお、stは、saに、edは、eaに、depthは、depthaに変えております。
No.2
- 回答日時:
Sub combisearch(ByVal st, ByVal ed, ByVal depth)
Dim i, temp
If depth - 1 < 1 Then
For i = st To ed
TextBox3.Text &= w0 & i & w1 & vbCrLf
count += 1
Next
Else
For i = st To ed
temp = w0
w0 &= i & " "
'ここだけ。
combisearch(1, ed, depth - 1)
'combisearch(i + 1, ed, depth - 1)
w0 = temp
Next
End If
End Sub
End Class
この回答への補足
ご回答ありがとうございました。
しかし、この方法では、重複順列を許しております。
たとえば、5,2と入力すれば、5*4=20通りとなるのですが、ここでは、25となります。
つまり、(1,1).(2,2).(3,3).(4,4).(5,5)が余計です。
これを省く方法をできれば教えていただけませんでしょうか。
お願いいたします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
65536は2の何乗なのでしょうか?
-
エクセルで特定のセルのみを任...
-
EXCELなどで「返す」という表現
-
CRC8を教えてください
-
引き放し法による除算アルゴリ...
-
NW7のチェックディジットについて
-
万年暦を導き出すプログラミング
-
傾いた四角形内の範囲の条件式
-
VBとVBAの違い
-
エクセルのセル式で恐縮ですが...
-
VB6で 1-0.1*10 の計算結果が...
-
勤怠管理表を作成しています、...
-
排他的論理和 BCC(水平パリテ...
-
ReportViewerのテキストボック...
-
モジュラス103の計算とは何でし...
-
matlab計算での進捗状況を知りたい
-
アドオン利率を実質年率に変換
-
正しい五十音順について
-
ファイルの開き方
-
あるプログラムのコマンドライ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
65536は2の何乗なのでしょうか?
-
変化させるセルが変化しない
-
EXCELなどで「返す」という表現
-
VBAの再計算が反映されない件に...
-
VBAで関数をつくる
-
matlabで計算終了
-
排他的論理和 BCC(水平パリテ...
-
モジュラス103の計算とは何でし...
-
引き放し法による除算アルゴリ...
-
バッチファイルでウインドウを...
-
スレッド処理からダイアログを...
-
数値計算の高速化 (cos, sin, exp)
-
エクセルで特定のセルのみを任...
-
モジュロ
-
関数を使わないで日付の計算を...
-
階乗のマクロ
-
時間(ミリ秒を含む)の引き算
-
なぜオーバーフローになるので...
-
論理演算子.NOT.の使い方
-
PHPとJavaでSHA256の結果を同じ...
おすすめ情報