Getallen

Status
Niet open voor verdere reacties.

RonaldGJ

Gebruiker
Lid geworden
28 apr 2007
Berichten
419
Beste mensen,

Ik ben bezig met een programma, wat op 1 ding na nog niet werkt. Het geen wat ik wil is een loop waarin een aantal getallen worden doorlopen.
Ik heb de strings A t/m J. Dit zijn 10 letters. Nu is het zo dat alle mogelijkheden moeten worden gemaakt met die letters dat ze steeds verschillende waardes hebben.

Voorbeeld:

#1: A = 0, B = 1, C = 2, D = 3, E = 4, F = 5, G = 6, H = 7, I = 8, J = 9
#2: A = 1, B = 0, C = 2, D = 3, E = 4, F = 5, G = 6, H = 7, I = 8, J = 9
#3: A = 0, B = 1, C = 3, D = 2, E = 4, F = 5, G = 6, H = 7, I = 8, J = 9

En zo moeten dus al die mogelijkheden worden gemaakt. Het is niet zo dat het van 0 t/m 999.999.999 is, omdat elk getal maar 1 keer mag voorkomen.

Ik hoop dat jullie het snappen, het is wat rommelig uitgelegd, maar weet niet goed hoe ik dit beter kan doen.

Ik hoop op reactie, dit is het laatste wat ik nog moet!!

Vast bedankt,

Gr. Ronald!:)
 
Permutatie

Hallo Ronald,

Als ik je vraag goed lees ben je op zoek naar alle mogelijke permutaties. Je zou dan 10! mogelijke volgordes met je programma gaan maken.

Heb je de indruk dat dit met een recursieve functie zou kunnen. Daar komt dan een loop in voor. Begin met 0 en vervolgens functie opnieuw aanroepen tot de array helemaal gevuld is. Als hij vol is kun je hem afdrukken. Vervolgens stap terug en ophogen en weer vooruit. Totdat ophogen 10 zou opleveren. Dan ook een stap terug.

Misschien heb je hier al wat aan. Succes!

Groet.
 
Het klopt inderdaad dat er 10! mogelijkheden zijn. Wat betreft die stappen snap ik niet helemaal. Die recursieve formule zal ik eens kijken.

Kun je een klein voorbeeldje geven?

Bedankt!

Gr. Ronald!:)
 
Ik kom er nog steeds niet uit helaas!!:(
Ik hoop dat je nog kunt reageren vandaag, ben er helemaal verslaafd aan op het ogenblik;). Ik hoef alleen dit nog en dan werkt het.

Gr. Ronald!:)
 
Ik ben er nu achter dat het ongeveer zo in elkaar zit:

0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 9 8
0 1 2 3 4 5 6 8 7 9
0 1 2 3 4 5 6 8 9 7
0 1 2 3 4 5 6 9 7 8
0 1 2 3 4 5 6 9 8 7
0 1 2 3 4 5 7 6 8 9
0 1 2 3 4 5 7 8 6 9
0 1 2 3 4 5 7 9 6 8
0 1 2 3 4 5 7 9 8 6

Gewoon steeds optellen totdat er geen dezelfde getallen meer voorkomen. Ik heb alleen echt geen idee hoe ik hier een functie voor moet schrijven. Ik ga er natuurlijk nog weer naar kijken, maar als iemand mij een beetje kan helpen, Graag!!

Gr. Ronald!:)
 
Hallo Ronald,

Eerder kon ik niet reageren om het antwoord toe te lichten. Je kunt dit probleem, alle mogelijkheden producren, "rechtstreeks" oplossen of recursief.
Rechtstreeks zit het denk ik als volgt:

(Merk op dat dit geen code is ondanks de tags)
Code:
Functie MaakAlleMogellijkheden() as boolean

Dim A,B,C,D,E,F,G,H,I,J as Integer

For A = 0 to 9
   For B= 0 to 9
      IF NOT A=B THEN
      For C=0to9
          IF NOT (A=C OR B=C)  THEN
          For D=0to9
              IF NOT (A=D OR B=D OR C=D)  THEN
              For E=0to9
                  IF NOT (A=E OR B=E OR C=E OR D=E)  THEN
                  For F=0to9
                      IF NOT (A=F OR B=F OR C=F OR D=F OR E=F)  THEN              
                      For G=0to9
                          IF NOT (A=G OR B=G OR C=G OR D=G OR E=G OR F=G)  THEN              
                          For H=0to9
                              IF NOT (A=H OR B=H OR C=H OR D=H OR E=H OR F=H OR G=H) THEN              
                              For I=0to9
                                  IF not(A=I OR B=I OR C=I OR D=I OR E=I OR F=I OR G=I OR H=I) THEN
                                  For J=0to9
                                      IF not(A=J OR B=J OR C=J OR D=J OR E=J OR F=J OR G=J OR H=J OR I=J) THEN
                                      print ABCDEFGHIJ
                                      END IF
                                  Next J
                                  END IF
                              Next I
                              END IF
                          Next H
                          END IF
                      Next G
                      END IF
                  Next F
                  END IF
              Next E
              END IF
          Next D
          END IF
      Next C
      END IF
  Next B
  END IF
Next A

End Function

In plaats van al deze for loopjes te starten kun je ook de oorspronkelijke functie aan kunnen roepen. Met andere woorden op de plaats waar de loop start de functie zelf aanroepen. Je moet er dan nog wel voor zorgen dat je op de juiste momenten afdrukt en de functie verlaat.

Groet,
Hunac
 
Laatst bewerkt:
Hallo Hunac,

Bedankt voor je reactie. Ik ga het zo direct proberen. Het ´print ABCDEFGHIJ´ hoef ik dan alleen te veranderen naar mijn gewenste. Ik laat je weten of het werkt. Iniedergeval harstikke bedankt!

Gr. Ronald!:)
 
Hallo Hunac, ik heb het eerst geprobeerd met alleen A, B en C. Hij doet het PERFECT! Ik heb het toen is geprobeerd met A, B, C, D en E. Ging ook heel snel. Nu probeer ik het met allemaal, maar nu krijg ik dus het gezeur: (reageert niet). Hij loopt vast.

Is er een manier om dit trager te laten gaan en gewoon een balkje neerzetten dat hij bezig is. Ik heb liever dat het iets langer duurt dan dat hij zelf een snelheid wil en vast loopt.

Ik hoop dat je mij nog kunt helpen.
Verder prima script!

Gr. Ronald!:)
 
Hallo Ronald,

Het vast lopen kan te maken hebben met `gewoon heel druk bezig zijn` of met een overbelasting van de pc in de zin van resources.

Het verschil tussen 5! en 10! is groot. Namelijk 3.628.680 mogelijkheden. Je routine zal veel langer draaien bij 10!. Misschien dat je kunt uitrekenen hoeveel langer.

Probeer eens stap voor stap een letter toe te voegen. Probeer F, en dan G, enzo. Tot en met J. Misschien dat je dat al gedaan hebt trouwens.

Succes,
Hunac.

Edit: Als je tijd hebt probeer nog een recursieve functie te maken. Deze zal mooier zijn en je kunt dan meegeven hoe diep, ABCD of ABCDEFG, er gekeken moet worden naar permutaties.
 
Laatst bewerkt:
Hallo Hunac,

Mijn computer is verder niet met dingen bezig. Het zal puur gaan om de zovele mogelijkheden. Ik had hem gisteravond nog een aangezet en er bij weggelopen. Toen ik terug kwam zei hij weer: (reageert niet). Hij kan het dus gewoon niet aan.

Ik weet dus niet of die tijd uitrekenen zin heeft.

Zou jij me eens uit willen leggen hoe die recursieve formulie precies op te bouwen en hoe die precies in elkaar zit?

Ik heb echt alle permutaties nodig met alle letters. Dus niet alleen ABCD of zoiets. Echt A t/m J.

Bedankt maar weer!!

Gr. Ronald!:)
 
Hallo Ronald,

De foutmelding doet me ook wat denken aan een loop waar hij niet uit komt. Zou je de code nog eens na willen lopen.

Recursief wordt het iets in de richting (weer geen code!):
Code:
Function MaakAlleMogelijkePermutaties (P as variant, D as integer) as variant
private i as integer
If D=length(P)+2 then
    Print P
else
    for i = 0 to length(P)
       if not i elementof P then
         P(D)=i
         MaakAlleMogelijkheden(P,D+1)
      end if
end if

end function

Sub HoofdRoutine()

const L as integer = 10 'De lengte van de array/aantal letters voor de permutatie.
dim P(L) as integer
dim Diepte as integer
Diepte =0

MaakAlleMogelijkePermutaties(P,Diepte)

end sub


Om er achter te komen wanneer de routine, die andere, vast loopt kun je proberen steeds een letter toe te voegen. Als hij I wel doet maar J niet dan ligt het aan de compu.

Groet,
Hunac
 
Hunac,

Ik ga er vanavond naar kijken. Bedankt voor je reactie!

Gr. Ronald!:)
 
Beste Hunac,

Ik ben er op het ogenblik druk mee bezig. Ik ben een stap voor stap elke letter aan het toevoegen. Wat ik doe is alle getallenreeksen toevoegen aan een listbox. Zo krijg ik alle mogelijkheden onder elkaar.

Bij F zie je dat de listbox net even wit blijft als je op de knop klikt. Bij G zie je duidelijk dat de listbox even wit is en heeft hij er dus al wat meer moeite mee. Hij blijft ongeveer 2 sec wit. Dan komen alle getallen te voorschijn.

Bij H toevoegen gaat het al langer duren dan 10 sec.

Bij I toevoegen heb ik 2 minuten gewacht en toen was het veld nog niet ingevuld.

Ik ga nu eens proberen met die formule. Ik snap hem niet, maar misschien kom ik er uit tijdens en implanteren.

Ik laat het zo wel weten.

Gr. Ronald!:)

Editje:

Ik snap namelijk niet wat 'Const' inhoudt, net zoals Dim as Variant (wat is variant), private i as integer (wat houdt private in). Misschien als ik dit snap dat ik dan het scriptje ook wat meer snap. Bedankt!
 
Laatst bewerkt:
Ik heb de rec. formule geplaatst.

Dit heb ik nu:

Code:
    Function MaakAlleMogelijkePermutaties(ByVal P As Object, ByVal D As Integer) As Object
        Dim i As Integer
        If D = Len(P) + 2 Then
            Print(P)
        Else
            For i = 0 To Len(P)
                If Not i elementof P then
                    P(D) = i
                    MaakAlleMogelijkheden(P, D + 1)
                End If
            Next i
        End If

    End Function

Variant veranderd hij in Object. Private i kent hij niet, daar heb ik Dim van gemaakt. elementof kent hij niet (dat is logisch, maar ik snap niet helemaal wat daar precies moet gebeuren). En bij MaakAlleMogelijkheden(P, D + 1) zegt hij dat er teveel argumenten zijn. Klopt, want bij de functie MaakAlleMogelijkheden() staat dat niet aangegeven.

Ideën en uitleg?

Ik hoor het graag.

Gr. Ronald!:)
 
Hallo Ronald,

De functie zoals ik hem genoteerd heb is niet in vb.net code. Ik ben niet voldoende thuis in de vb.net. Wel aardig in VBA. De notatie lijkt wel veel op vb maar is het niet. Voor bijvoorbeeld "elementof" is het nodig zelf de

Een recursieve functie is een functie die zich zelf aanroept. Het is belangrijk om op het juiste moment te stoppen met de functie opnieuw aan te roepen en het resultaat te exporteren.

Je merkte op dat je ze in een dropdown menu stopt. Het gaat om heel veel oplossingen, bij J. Is het mogelijk dat je ze, als test naar, een .txt file schrijft?

Het zou kunnen dat D + 1 niet werkt. Dan zul je eerst D= D+1 doen en vervolgens functie met D aanroepen. Het zou ook kunnen dat de , een ; moet zijn.

Ben benieuwd of dit wat oplevert.

Groet,
Hunac
 
Laatst bewerkt:
Hallo Hunac,

Ik weet zelf het volgende probleem niet goed op te lossen:

Code:
MaakAlleMogelijkheden(P, D + 1)

en

Code:
Functie MaakAlleMogellijkheden() as boolean

Dim A,B,C,D,E,F,G,H,I,J as Integer

For A = 0 to 9
   For B= 0 to 9
      IF NOT A=B THEN
      For C=0to9
          IF NOT (A=C OR B=C)  THEN
          For D=0to9
              IF NOT (A=D OR B=D OR C=D)  THEN
              For E=0to9
                  IF NOT (A=E OR B=E OR C=E OR D=E)  THEN
                  For F=0to9
                      IF NOT (A=F OR B=F OR C=F OR D=F OR E=F)  THEN              
                      For G=0to9
                          IF NOT (A=G OR B=G OR C=G OR D=G OR E=G OR F=G)  THEN              
                          For H=0to9
                              IF NOT (A=H OR B=H OR C=H OR D=H OR E=H OR F=H OR G=H) THEN              
                              For I=0to9
                                  IF not(A=I OR B=I OR C=I OR D=I OR E=I OR F=I OR G=I OR H=I) THEN
                                  For J=0to9
                                      IF not(A=J OR B=J OR C=J OR D=J OR E=J OR F=J OR G=J OR H=J OR I=J) THEN
                                      print ABCDEFGHIJ
                                      END IF
                                  Next J
                                  END IF
                              Next I
                              END IF
                          Next H
                          END IF
                      Next G
                      END IF
                  Next F
                  END IF
              Next E
              END IF
          Next D
          END IF
      Next C
      END IF
  Next B
  END IF
Next A

End Function

Bij de functie MaakAlleMogelijkheden() zijn die P en D + 1 niet gedeclareerd.

Het moet toch zoiets worden als MaakAlleMogelijkhede(ByVal P, ByVal D) en hoe moet ik dan die P en D weer in die functie verwerken.

Iets als:
Code:
For A = 0 to D
   For B = 0 to D
     enz...
   Next B
Next A

zoiets? En waar moet dan de P komen?

Gr. Ronald!:)
 
Hallo Ronald,

Eerder begreep ik niet goed waarom er niet genoeg argumenten waren, nu wel.

Onderscheidt twee situaties:
  1. Iteratief: De functie met alle for loopjes (post 17 augustus 2009 13:44)
  2. Recursief: De sub en functie (post 19 augustus 2009 06:49 )
Dit zijn twee verschillende situaties. Gebruik of de iteratieve functie van punt 1 of gebruik de sub én recursieve functie van punt 2.

Dit zou je probleem, zoals je dat hieronder omschrijft, moeten oplossen.

Succes en groet,
Hunac
 
Hallo Hunac,

Moet hetgeen wat ik hieronder rood heb gearceerd niet veranderd worden?

Code:
Function MaakAlleMogelijkePermutaties (P as variant, D as integer) as variant
private i as integer
If D=length(P)+2 then
    Print P
else
    for i = 0 to length(P)
       if not i elementof P then
         P(D)=i
         [COLOR="Red"]MaakAlleMogelijkheden[/COLOR](P,D+1)
      end if
end if

end function

Sub HoofdRoutine()

const L as integer = 10 'De lengte van de array/aantal letters voor de permutatie.
dim P(L) as integer
dim Diepte as integer
Diepte =0

MaakAlleMogelijkePermutaties(P,Diepte)

end sub

Naar:

Code:
Function MaakAlleMogelijkePermutaties (P as variant, D as integer) as variant
private i as integer
If D=length(P)+2 then
    Print P
else
    for i = 0 to length(P)
       if not i elementof P then
         P(D)=i
        [COLOR="Red"] MaakAlleMogelijkePermutaties[/COLOR](P,D+1)
      end if
end if

end function

Sub HoofdRoutine()

const L as integer = 10 'De lengte van de array/aantal letters voor de permutatie.
dim P(L) as integer
dim Diepte as integer
Diepte =0

MaakAlleMogelijkePermutaties(P,Diepte)

end sub

Gr. Ronald!:)
 
Ik weet niet zeker of onderstaande is wat jullie zoeken, maar misschien waard om te proberen. Hij Zet bij mijn in 50 seconde alle mogelijkheden in de datagridview.

Onderstaande code is in VB.Net.
> Maak een nieuw project.
> Voeg een Button met de naar Button1 toe.
> Voeg een DataGridView toe met de naam DataGridView1
> Plak de onderstaande code.

Start project en druk op de knop.

De code komt niet van mezelf maar is gevonden op http://members.lycos.nl/permutation/

Code:
Public Class Form1
    Dim dt As New DataTable
    Dim L() As String = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
    Dim UB, UBm1 As Integer

    Public Sub New()

        ' This call is required by the Windows Form Designer.
        InitializeComponent()

        ' Add any initialization after the InitializeComponent() call.
        dt.Columns.Add("PreMutaties")

    End Sub
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        GetPermutation()
        DataGridView1.DataSource = dt
    End Sub

    Private Sub GetPermutation()
        Dim I, J, K As Integer
        UB = L.GetUpperBound(0)
        UBm1 = UB - 1
        Do
            I = UBm1
            Do While I > 0 And L(I) >= L(I + 1)
                I -= 1
            Loop
            K = L(I)
            J = UB
            Do While J > 0 And L(J) <= K
                J -= 1
            Loop
            L(I) = L(J)
            L(J) = K
            Array.Reverse(L, I + 1, UB - I)
            Dim str As String = String.Join("", L)
            Dim dr As DataRow = dt.NewRow
            dr.Item("PreMutaties") = str
            dt.Rows.Add(dr)
        Loop While J
    End Sub
End Class
 
Hallo Spiderman,

Het gaat mij erom dat ik alle mogelijkheden krijg, maar wel zo dat ze in de integers staan van A t/m J.

Dus: A=0, B=1.......

en dan een andere mogelijkheid bijvoorbeeld

A= 7, B=3...... enz.

Ik weet niet of dit hier mee kan?

Ik moet zo weer werken, dus ik ga er vanavond naar kijken.

Gr. Ronald!:)
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan