Ik ben bezig met een opdracht over het bekende spel "4 op een rij". De laatste optie die mij rest is om het aantal mogelijke vervolg spellen uit te rekenen die nog gespeeld kunnen worden.
Het gaat om een recursief algoritme, hieronder in c++ weergegeven.
Het gaat echter fout bij het limiteren van het maximaal aantal aanroepen. Het zou namelijk immens lang duren om een leeg bord uit te rekenen(Ik zou zeggen om het bord vol te spelen al 2^42 min de mogelijkheden dat iemand tussendoor 4 op een rij heeft). Daarom wil ik de "diepte" limiteren.
Mijn ingeving is dat als ik bij de eerste aanroep diepte 10 zou geven,dat hij na 10 'recursies' terug zou gaan vallen en uiteindelijk returnen aan de aanroeper. Blijkbaar heb ik hier in een gedachtefout gemaakt want het eindigt in een oneindige loop. Ziet iemand wat ik verkeerd heb gedaan?
Het gaat om een recursief algoritme, hieronder in c++ weergegeven.
Het gaat echter fout bij het limiteren van het maximaal aantal aanroepen. Het zou namelijk immens lang duren om een leeg bord uit te rekenen(Ik zou zeggen om het bord vol te spelen al 2^42 min de mogelijkheden dat iemand tussendoor 4 op een rij heeft). Daarom wil ik de "diepte" limiteren.
Mijn ingeving is dat als ik bij de eerste aanroep diepte 10 zou geven,dat hij na 10 'recursies' terug zou gaan vallen en uiteindelijk returnen aan de aanroeper. Blijkbaar heb ik hier in een gedachtefout gemaakt want het eindigt in een oneindige loop. Ziet iemand wat ik verkeerd heb gedaan?
C++: vervolgspellen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
| // berekent recursief het aantal vervolgpartijen int bord::vervolgpartijen(int diepte){ int vervolgp = 0; // aantal vervolgpartijen // als het spel "klaar is" is dat 1 manier op het uit te spelen // geef dus 1 terug if(gewonnen() || veldvol()) return 1; if(diepte == 0) // hij moet er dus uitspringen bij diepte 0 return 0; // loop steeds de breedte van het bord af for(int i=0;i<bordbreedte;i++){ if(toegestaan(i)){ // als er een zet gedaan mag worden doezet(i,aanzet); // doe dan deze zet aanzet *= -1; // wissel van gebruiker // roept zichzelf aan om deze routine te herhalen per aanroep // zo wordt in vervolgp steeds de waarde van de vorige recursie opgetelt // uiteindelijk bevat dit dus het aantal vervolgpartijen vervolgp += vervolgpartijen(diepte--); // zet het steeds in de variabele ontdoezet(i); } } return vervolgp; } |
[ Voor 0% gewijzigd door Verwijderd op 26-11-2009 21:59 . Reden: typo ]