Toon posts:

Recursive 'For'-loop in ASP/VBScript- "Leuk" probleem

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hallo allemaal,

Ik heb een leuk maar uiterst frustrerend probleem, khoop dat iemand me kan helpen (heb dit probleem al gepost op www.quichefree.com, maar daar zijn we d'r ook nog niet uit)

De output die ik graag wil hebben van een ASP script ziet er ongeveer zo uit:

1
2
3
1 + 1
1 + 2
1 + 3
2 + 2
2 + 3
3 + 3
1 + 1 + 1
1 + 1 + 2
1 + 1 + 3
1 + 2 + 2
1 + 2 + 3
1 + 3 + 3
2 + 2 + 2
2 + 2 + 3
2 + 3 + 3
3 + 3 + 3

De code ziet er ongeveer zo uit:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
For intValue1 = 1 to 3
  Response.Write (intValue1 & "<BR>" & vbCR)
Next

For intValue1 = 1 to 3
  For intValue2 = intValue1 to 3
    Response.Write (intValue1 & " + " & intValue2 & "<BR>" & vbCR)
  Next
Next

For intValue1 = 1 to 3
  For intValue2 = intValue1 to 3
    For intValue3 = intValue2 to 3
      Response.Write (intValue1 & " + " & intValue2 & " + " intValue3 & "<BR>" & vbCR)
    Next
  Next
Next


Zie je het probleem al? Wat te doen als ik door wil gaan tot 3 + 3 + 3 + 3 + .. [x keer] .. + 3?

Moet ik gebruik maken van zelf aanroepende loops (recursive loops)? En zo ja, hoe?

Alvast bedankt voor de hulp _/-\o_

F(c)k

[ Voor 9% gewijzigd door Verwijderd op 14-05-2003 12:59 ]


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

Hint: Denk er eens aan om een functie te definieren, en deze steeds aan te roepen. Verder laat je de functie zichzelf aanroepen, totdat een bepaalde waarde geldig is.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Verwijderd

Topicstarter
Bedankt voor je antwoord Gorgi :>

Zo simpel dacht ik er in het begin ook over, maar zo simpel is het dus niet. Als je tijd te veel hebt moet je het maar eens proberen... Het is een loop in een loop in een loop ... tot potentieel in het oneindige. Dat is namelijk het probleem, ik weet niet van te voren hoe lang ik door moet/wil gaan en met hoeveel waardes.

F(c)k

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 19-08 22:14

Bosmonster

*zucht*

Dat is namelijk het probleem, ik weet niet van te voren hoe lang ik door moet/wil gaan en met hoeveel waardes.
Wanneer weet je dit wel dan? :P

  • SWfreak
  • Registratie: Juni 2001
  • Niet online
gorgi_19 schreef op 14 May 2003 @ 12:08:
Hint: Denk er eens aan om een functie te definieren, en deze steeds aan te roepen. Verder laat je de functie zichzelf aanroepen, totdat een bepaalde waarde geldig is.
Met een normale recursieve functie is dit niet echt lekker te doen hoor. Als je alles ff als een boom ziet, wil ie eigenlijk de niveaus van een boom langsgaan en bij ieder bezoek alle ouders opnoemen. Das niet lekker recursief te maken...

Edit: Trouwens het kan wel zo: eerst dmv recursie alle mogelijke combinaties ophalen en die vervolgens in lexicografische volgorde sorteren en outputten :)

[ Voor 14% gewijzigd door SWfreak op 14-05-2003 12:24 ]


Verwijderd

Topicstarter
Bosmonster schreef op 14 mei 2003 @ 12:16:
Wanneer weet je dit wel dan? :P
Hangt van de input af.

Ik wil twee waarde in kunnen geven:

- De eerste bepaalt het aantal waardes (in het voorbeeld is dit 3; was het 4 geweest had de "boom" begonnen met 1, 2, 3, 4, 1 + 1)

- De tweede geeft aan in hoeverre de waardes worden gecombineerd, de diepte van de "boom" (in het voorbeeld is dit ook 3; was het 4 dan was de boom doorgegaan tot 3 + 3 + 3 + 3)

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 19-08 22:14

Bosmonster

*zucht*

Hmm je bent combinaties aan het berekenen, dus het aantal mogelijke combinaties per 'getal' is 'getal' macht 'aantal'. Misschien dat je de combinaties zo per eenheid kunt berekenen. In dit geval dus 3x.

Moet je alleen nog een functie maken die alle combinaties uit kan poepen van een x aantal getallen, dus bijvoorbeeld (3, 3) voor het laatste rijtje in je openingspost. Zo splits je het gebeuren op per aantal getallen en zit je met een veel makkelijkere recursieve functie lijkt me?

Een recursief proces dat je x aantal keer aanroept?

[ Voor 7% gewijzigd door Bosmonster op 14-05-2003 12:31 ]


  • bigtree
  • Registratie: Oktober 2000
  • Laatst online: 07-07 11:51
Benader het als volgt, dat maakt het een stuk duidelijker/makkelijker:

0 + 0 + 1
0 + 0 + 2
0 + 0 + 3
0 + 1 + 1
0 + 1 + 2
0 + 1 + 3
0 + 2 + 2
0 + 2 + 3
0 + 3 + 3
1 + 1 + 1
1 + 1 + 2
1 + 1 + 3
1 + 2 + 2
1 + 2 + 3
1 + 3 + 3
2 + 2 + 2
2 + 2 + 3
2 + 3 + 3
3 + 3 + 3

Lekker woordenboek, als je niet eens weet dat vandalen met een 'n' is.


  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 19-08 22:14

Bosmonster

*zucht*

bigtree schreef op 14 mei 2003 @ 12:33:
Benader het als volgt, dat maakt het een stuk duidelijker/makkelijker:

0 + 0 + 1
0 + 0 + 2
...
Ja dat kan ook.. das nog makkelijker :) Gewoon altijd de 0 meerekenen. Kom je op hetzelfde uit zeg maar.. dat je geen variabel aantal meer hebt, dit staat dan vast en maakt je recursie een stuk makkelijker.

Verwijderd

Topicstarter
Bosmonster schreef op 14 May 2003 @ 12:30:
Hmm je bent combinaties aan het berekenen
Nee, niet helemaal waar. Ik wil graag de *uitkomsten* van alle mogelijke combinaties berekenen. En mijn "opdrachtgever" vereist een output in de vorm die ik hierboven heb gepresenteerd.

Ik denk trouwens wel dat we met "het eerst uitpoepen van alle combinaties" (en daarna in de goede volgorde zetten) op de goede weg zitten... Ik ga coden en laat weten of er nog problemen zijn.

Thnks all :)

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 19-08 22:14

Bosmonster

*zucht*

Nee, niet helemaal waar. Ik wil graag de *uitkomsten* van alle mogelijke combinaties berekenen.
Als dat zo is dan ben je vrij snel klaar.. das namelijk gewoon alles tussen 1 en max tot de macht aantal zeg maar.. :) Je komt in je uitkomsten als je op deze manier rekent namelijk alle uitkomsten tegen.

Tenzij je ook een variabel minimum hebt.. maar dat heb je nog niet gezegd :P

edit: ow je docent wil de uitgebreide weergave... kutdocenten altijd :P

[ Voor 21% gewijzigd door Bosmonster op 14-05-2003 12:42 ]


  • CyberSnooP
  • Registratie: Augustus 2000
  • Laatst online: 31-03 16:47

CyberSnooP

^^^^ schrijft --->

Ik wil twee waarde in kunnen geven:

- De eerste bepaalt het aantal waardes (in het voorbeeld is dit 3; was het 4 geweest had de "boom" begonnen met 1, 2, 3, 4, 1 + 1)
Dit noem ik MaxWaarde
- De tweede geeft aan in hoeverre de waardes worden gecombineerd, de diepte van de "boom" (in het voorbeeld is dit ook 3; was het 4 dan was de boom doorgegaan tot 3 + 3 + 3 + 3)
Dit noem ik MaxDepth

Beetje erg vage code-mix van Delphi, PHP en wat je er nog maar meer in herkend, maar volgens mij wordt het zo iets:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function MaakOptelReeks(MaxWaarde, Depth, CurrentDepth: Integer; 
  CurrentReeks: String): array of Strings {

  for i = 1 to MaxWaarde {
    if Depth == CurrentDepth {
      Result[] = CurrentReeks . i;
    } else {
      Result[] = MaakOptelReeks(MaxWaarde, Depth, CurrentDepth + 1, CurrentReeks . i . " + ");
    }
  }
}
 
for i = 1 to MaxDepth {
  Uitvoer[]  = MaakOptelReeks(MaxWaarde, i, 1, "");
}

[ Voor 4% gewijzigd door CyberSnooP op 14-05-2003 12:39 ]

|_____vakje______|


Verwijderd

Topicstarter
bigtree schreef op 14 May 2003 @ 12:33:
Benader het als volgt, dat maakt het een stuk duidelijker/makkelijker:

0 + 0 + 1
0 + 0 + 2
[...]
Helemaal top!

Dat was het antwoord waar ik op zat te wachten _/-\o_

Thnks !!

  • momania
  • Registratie: Mei 2000
  • Laatst online: 10:59

momania

iPhone 30! Bam!

Je kan ook met een lossen functie door een aanroep naar zichzelf beginnen bij het diepste punt. Even kijken of ik het een beetje uit kan leggen.

Ik heb een functie die die voor getallen 'van' t/m 'tot' steeds <value>+<value>.... doet.
Als extra parameter geef je in die funtie de diepgang mee als een integer (of anders)
In je funtie trek trek je van de diepgang er 1 af er roep je direct jezelf weer aan.
Dit gaat dan net zo lang door tot er geen diepgang meer is en dan begin je adv loopjes je waardes op het scherm te zetten.
Dan krijg je dus dat je evengoed begint bij een diepgang 1 en dan vanuit de diepste functie steeds een functie terug kruipt.

Nu ff een code voorbeeld (wel in java dan)

Java:
1
2
3
4
5
6
7
8
9
10
11
public void printStuff(int from, int to, int times) {

    if (times > 1) {
        // Nog meer dan 1? Stappie dieper gaan dus.
        // Net zo lang tot we bij de kleinste zijn.
        printStuff(from, to, (times - 1))   ;
    }

    // Hier maak je dus adv je parameter de loopjes
    // om de data op zo te krijgen als je wilt.
}

nu kun je dus door het volgende van te vorden al zeggen dat je bv tot 10 wil gaan:
Java:
1
printStuff(1, 3, 10);

krijg je dus
1
2
3
......
3+3+3+3+3+3+3+3+3+3

Neem je whisky mee, is het te weinig... *zucht*


  • bigtree
  • Registratie: Oktober 2000
  • Laatst online: 07-07 11:51
Voor de liefhebbers:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
function mogelijkheden($values, $MaxWaarde, $MaxDepth) {

    if (sizeof($values) == $MaxDepth) {
        if (array_sum($values) > 0) print implode(" + ", $values) . "<BR>";
    } else {
        for ($i = (0 + $values[sizeof($values) - 1]); $i <= $MaxWaarde; $i++) {
            mogelijkheden(array_merge($values, array($i)), $MaxWaarde, $MaxDepth);
        }
    }

}

mogelijkheden(array(), 3, 3);

Lekker woordenboek, als je niet eens weet dat vandalen met een 'n' is.


Verwijderd

Topicstarter
bigtree, hoewel ik niet helemaal bekend ben met php, kan ik zien dat het er goed uitziet...

heb jij (of misschien iemand anders) een "vertaling" van dit script in VBScript / ASP? Ik heb namelijk geen mogelijkheden om php scripts te draaien hier.

thanks!!

Verwijderd

GoT P & W is niet echt de plaats voor voorzeggen, meer voor voorzetjes die je zelf mag inkoppen.

[ Voor 3% gewijzigd door Verwijderd op 14-05-2003 13:49 ]


Verwijderd

Topicstarter
Verwijderd schreef op 14 mei 2003 @ 13:48:
GoT P & W is niet echt de plaats voor voorzeggen, meer voor voorzetjes die je zelf mag inkoppen.
Ik heb op meerdere forums dezelfde vraag geplaatst, heb erg veel voorzetjes gehad, erg veel geprobeerd, collega's erbij gehaald, maar tot op de dag van vandaag geen werkend script gezien... :'(

Ben ook vandaag weer met al het bovenstaande aan de slag gegaan (nog steeds ... ;( ), maar ben er nog steeds niet uit. Normaal heb ik bij een probleem inderdaad genoeg aan "een voorzetje", maar dit is zo'n lastig probleem dat voorzetjes niet meer genoeg zijn. Ga er maar eens dieper op in, probeer eens wat... en je zult zien het is veel (VEEEEL) moeilijker dan je zou denken.

Om eerlijk de waarheid te vertellen, ik heb de code niet eens meer nodig, ik weet nauwelijks meer waarom ik dit ooit nodig had... het is voor mij nu puur een "I HAVE TO KNOW" kwestie geworden.

Bedankt voor de inzet. Hoop dat jullie er ook wat aan hebben (behalve hoofdpijn ;) )

Grtn,
Fck

  • bigtree
  • Registratie: Oktober 2000
  • Laatst online: 07-07 11:51
Verwijderd schreef op 14 May 2003 @ 14:43:
[...]Ben ook vandaag weer met al het bovenstaande aan de slag gegaan (nog steeds ... ;( ), maar ben er nog steeds niet uit. Normaal heb ik bij een probleem inderdaad genoeg aan "een voorzetje", maar dit is zo'n lastig probleem dat voorzetjes niet meer genoeg zijn. Ga er maar eens dieper op in, probeer eens wat... en je zult zien het is veel (VEEEEL) moeilijker dan je zou denken.
Eerst krijg je een tip die je omschrijft als 'Dat was het antwoord waar ik op zat te wachten', vervolgens post ik een stuk werkende PHP-code en dan nog is het niet goed.

Als je niet in staat bent die 6 regels code, al dan niet met behulp van de manual, te porteren naar VBscript, moet je gewoon geduldig blijven proberen tot je er uit komt. Maar kom in dit forum niet met scriptrequests, daar is het niet voor bedoeld. En zoals het topic al zegt; het is een "leuk" probleem. Maar nu het opgelost is, mag je het zelf in code gaan zetten.

Lekker woordenboek, als je niet eens weet dat vandalen met een 'n' is.


Verwijderd

Topicstarter
Eerst krijg je een tip die je omschrijft als 'Dat was het antwoord waar ik op zat te wachten', vervolgens post ik een stuk werkende PHP-code en dan nog is het niet goed.
Ja, klopt is mijn fout. Ik was iets te enthousiast en blijf iedere keer dezelfde denkfout maken. Die nullen klonken erg goed, maar tijdens het testen kwam ik er achter dat ik meer nodig had. Had dus ook wijslijk mijn hoofd moeten houden. :X Sorry.

Inmiddels nemen de tips over het omgaan met tips de overhand en zal ik een dezer dagen echt de tijd nemen naar het probleem en de tips te kijken. Verslag/ vragen/opmerkingen volgen later... hurrah !! :P

Thnx,
Fck

  • Vaan Banaan
  • Registratie: Februari 2001
  • Niet online

Vaan Banaan

Heeft ook Apache ontdekt

Ik ben niet thuis in php, maar zo te zien, is het voorbeeld van bigtree ook ongeveer mijn gedachtenkronkel.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
mogelijkheden(van, tot, lengte)

functie mogelijkheden(van, tot, lengte)
loop van 1 tot 'lengte'
   vul een array(lengte is waarde van loop) met 'van'
   recursieding(van, tot, waarde van loop, array)
<einde loop>   

functie recursieding(van, tot, diepte, array)
   - print array
   als de waarde van array('diepte') is 'tot'
      - verlaag 'diepte'
   als 'diepte' > 0 dan
      als de waarde van array('diepte') kleiner is dan 'tot'
         - vul de array van het eind van de array tot en met
       'diepte' met de waarde + 1 van array('diepte')
         - geef 'diepte' weer de waarde van lengte array
     - recursieding(van, tot, diepte, array)

-edit-
Nu ik er nog eens over nadenk, slaat die recursie helemaal nergens op. Als je uit de recursie komt, gebeurt er niets meer, dus vreet het alleen maar geheugen.
Dit is denk ik beter:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
mogelijkheden(van, tot, lengte)

functie mogelijkheden(van, tot, lengte)
loop van 1 tot 'lengte'
   - vul een array(lengte is waarde van loop) met 'van'
   - vul variabele 'diepte' met waarde van 'loop'
   zolang 'diepte'>0
      - print array
      als de waarde van array('diepte') is 'tot'
         - verlaag 'diepte'
      als 'diepte' > 0
         als de waarde van array('diepte') kleiner is dan 'tot'
            - vul de array van het eind van de array tot en met
              'diepte' met de waarde + 1 van array('diepte')
            - geef 'diepte' weer de waarde van lengte array
   <einde zolang>
<einde loop>

[ Voor 52% gewijzigd door Vaan Banaan op 15-05-2003 16:40 ]

500 "The server made a boo boo"


  • Apollo_Futurae
  • Registratie: November 2000
  • Niet online
hopend dat de topicstarter mij vergeeft, vervuil ik, om zieltjes te winnen voor de hemel van het functioneel programmeren, graag dit topic met de oplossing van dit probleem in haskell:

Haskell:
1
2
3
getallen :: Int -> Int -> String
getallen n d = implode "\n" . map (implode " + " . map show . reverse) . concat . take d . iterate (concatMap $ \x -> zipWith (:) [maximum x..n] $ repeat x) . map (:[]) $ [1..n]
  where implode f = concat . intersperse f
waarbij n het aantal verschillende getallen is en d het aantal niveau's.

Pas de replâtrage, la structure est pourrie.

Pagina: 1