Avatar billede therichman Nybegynder
11. juli 2003 - 11:53 Der er 13 kommentarer og
1 løsning

Vis ALLE de mulige kombinitationer

Jeg har kigget lidt på denne kode:

Option Explicit
Dim n As Byte, p As Byte, R As String
Const Tegn = "ABCDEFGHIJKLMNO"
Sub Komb(ByVal pos As Byte, ByVal sum As Byte, med As Boolean, ByVal s As String)
  If med Then
    s = s & Mid(Tegn, pos, 1): sum = sum + 1
  End If
  If sum < p And pos < n Then
    Komb pos + 1, sum, False, s
    Komb pos + 1, sum, True, s
  End If
  If sum = p Then R = R & s & " , "
End Sub


Private Sub Form_Load()
  n = 5: p = 3
  Komb 1, 0, False, ""
  Komb 1, 0, True, ""
  MsgBox R
End Sub

Og den virker også fint. Men jeg vil godt have, at hvert tal/bogstav kan bruges flere gange, altså: AAA BAA CAA ABA BBA CBA osv.
Avatar billede nmh Nybegynder
11. juli 2003 - 12:00 #1
Din kode (som jeg i øvrigt har lavet. (Se spørgsmål om listning af kobinationer)) skal ændres til:

Option Explicit
Dim n As Byte, p As Byte, R As String
Const Tegn = "ABCDEFGHIJKLMNO"
Sub Komb(ByVal pos As Byte, ByVal sum As Byte, ByVal Npos As Byte, ByVal s As String)
  Dim i As Byte
  For i = 1 To Npos
    s = s & Mid(Tegn, pos, 1): sum = sum + 1
  Next
  If sum < p And pos < n Then
    For i = 0 To p - sum
      Komb pos + 1, sum, i, s
    Next
  End If
  If sum = p Then R = R & s & " , "
End Sub


Private Sub Form_Load()
Dim A, q As Byte, i As Byte
  n = 4: p = 3
For i = 0 To p
  Komb 1, 0, i, ""
Next
  MsgBox R
  A = Split(R, ",")
  q = UBound(A)
  MsgBox q
End Sub
Avatar billede therichman Nybegynder
11. juli 2003 - 12:08 #2
Hej igen nmh!
Jeg prøvede at ændre det, så det istedet for 3 tegn var 8 tegn.
Men så kom den med en fejmeddelese hvor der stod: Overflow
Og så markerede den følgende:  q = UBound(A)

Hvis du sørger for at dette ikke sker, får du pointene.
Avatar billede erikjacobsen Ekspert
11. juli 2003 - 12:10 #3
Eller lidt simplere.

dim s
s="ABC"

sub f(t)
  dim i
  if len(t)=len(s) then
    response.write t & "<br>"
  else
    for i=1 to len(s)
      call f(t & mid(s,i,1))
    next
  end if
end sub

call f("")
Avatar billede nmh Nybegynder
11. juli 2003 - 12:14 #4
Du skal blot ændre erklæringe af q som før var dim q as byte til

dim q as long
Avatar billede martin_moth Mester
11. juli 2003 - 12:56 #5
Eller endnu bedre As Integer - den optager mindre plads end en Long ;o)
Avatar billede nmh Nybegynder
11. juli 2003 - 13:05 #6
Martin Moth>Ja, men det kan let ske at listen bliver så lang, at den et heltal også vil give overløb. Derfor typen long.

I øvrigt vil programmet køre ulideligt langsomt, hvis tekststrengen R begynder at blive stor. Addition af tekststrenge er ikke noget VB er glad for. Så man skulle nok istedet benytte en dynamisk tabel til at opsamle resultaterne.
(men igen: hvad skulle man dog bruge 1000000 tekststrenge til?)
Avatar billede martin_moth Mester
11. juli 2003 - 13:32 #7
Eller skrive resultaterne til en fil...

Anyway - en smart funktion f(t) du har lavet :o)
Avatar billede erikjacobsen Ekspert
11. juli 2003 - 13:44 #8
Hvis det kun er antallet man skal bruge, er der nemmere måder at finde det på ;)

Men ellers: en gammeldags cykellås, Ind/Ud/Ingenting - så er det en god ting
at have hele listen.
Avatar billede nmh Nybegynder
11. juli 2003 - 14:53 #9
>ErikJacobsen> Din løsning duer desværre ikke. Du gør forskel på rækkefølgen. AAC og CAA skal opfattes som det samme "ord".
Feks. hvis der n=2 og p=2
AA, AB, BA er de eneste. Din løsning udskriver AA, AB, BA og BB.
Avatar billede nmh Nybegynder
11. juli 2003 - 15:00 #10
Antallet af ord af længde p og hvor tegnene skal udtages fra et alfabet med n tegn ere som bekendt p^n. Deter også det, der svarer til cykellås-situationen.

Men hvad bliver antallet, hvis vi er lige glade med rækkefølgen af tegnene? Her kan jeg ikke umiddelbart finde en formel.
Avatar billede erikjacobsen Ekspert
11. juli 2003 - 15:02 #11
Ja ja, jeg henholder mig kun til spørgerens formulering. Det er jo ikke
til at vide, at der stikker noget under ;)
Avatar billede nmh Nybegynder
11. juli 2003 - 15:16 #12
ErikJacobsen> Du har ret i at formuleringen er uheldig.Spørgsålet dukkede op i forbindelse med en løsning til
http://www.eksperten.dk/spm/374314
som handler om at få udskrevet en liste af kombinationer (p forskellige ting udtages fra en samling af n forskellige ting).

Løsningen her er iøvrigt endnu ikke akcepteret af den, der har stillet spørgsmålet.
Avatar billede erikjacobsen Ekspert
11. juli 2003 - 16:19 #13
Men vi kan nemt lave mit lille eksempel om:

dim s,max
s="ABC"
max=3


sub f(t,j)
  dim i
  if len(t)=max then
    response.write t & "<br>"
  else
    for i=j to len(s)
      call f(t & mid(s,i,1),i)
    next
  end if
end sub

call f("",1)
Avatar billede nmh Nybegynder
11. juli 2003 - 16:37 #14
Ja,nu er det ok. En god løsning!
Nu ville det være rart at kunne finde et regneudtryk for antallet af "ord".
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester

Seneste spørgsmål Seneste aktivitet
I går 10:21 Ny printer, men hvilken Af mort1 i Printere
13/0819:41 USB på Linux Af Uvanga i Linux
12/0818:26 Hvilken type mus Af mort1 i PC
11/0813:21 ms Forms Af leahcim i Andet software
10/0821:30 Blokeret på Snapchat? Af LineP i Chat & Messaging