アプリ版:「スタンプのみでお礼する」機能のリリースについて

下記が、組み合わせを求めるプログラムです。
これのどこを変更すれば、順列を列挙するプログラムになりますか(ただし、重複順列でない。例、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

「順列のプログラムについて(VB)」の質問画像

A 回答 (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
がうまくいっていたのでたぶん大丈夫かと。
    • good
    • 0
この回答へのお礼

今まで、ご回答ありがとうございました。
おかげさまで、見事順列列挙プログラムが完成しました。

また、プログラムのことで何か困ったことがあれば、ご回答お願いいたします。

お礼日時:2011/11/07 17:18

あっ、すいません。


combisearch(1, ed, depth - 1 , i)
です。
でも、depth = 2 のときうまくいくはずですが、
depth >2 のときに問題があることに気づいたのでちょっと考え直して改めて回答いれます。
    • good
    • 0

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に変えております。

補足日時:2011/11/06 21:18
    • good
    • 0

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)が余計です。
これを省く方法をできれば教えていただけませんでしょうか。
お願いいたします。

補足日時:2011/11/06 17:02
    • good
    • 0

無理に拡張しようとせず、設計しなおした。



https://ideone.com/52cT1
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!