Node JS - rekurzív függvényhívás probléma

Node JS - rekurzív függvényhívás probléma
2017-01-11T09:55:35+01:00
2017-01-13T12:49:34+01:00
2022-10-15T22:01:22+02:00
Axxtros
Sziasztok,

A klasszikus - rekurzív -labirintus generáló algoritmust próbálom összerakni, most (node) javascript-ben. (Korábban C-ben már megoldottam.) A probléma az, hogy mindig maximum call stack size exceeded hibát dob. A kérdésem az lenne, hogy a lenti kódot hogyan írjam át úgy, hogy rendesen lefusson. Sok példát néztem, próbáltam async-re átírni (itt nem futott le), setTimeout-ra (itt mindig abba futottam bele, hogy mazeGenerator is not a function). De szerintem csak én nem vettem észre valamit.

A kód:

private mazeGenerator(map: any, x: number, y: number): void { var directions = [ 0, //up 1, //down 2, //left 3 //right ]; map[x][y] = 1; //maze for (var i = 0; i < directions.length; i++) { var randDir = Math.floor((Math.random() * 4)); var tempDir = directions[i]; directions[i] = directions[randDir]; directions[randDir] = tempDir; } for (var i = 0; i < directions.length; i++) { switch (directions[i]) { case 0: //up if (y >= 2 && map[y - 2][x] != 1) { map[y - 1][x] = 1; this.mazeGenerator(map, x, y - 2); } break; case 1: //down if (y < map.lenght - 2 && map[y + 2][x] != 1) { map[y + 1][x] = 1; this.mazeGenerator(map, x, y + 2); } break; case 2: //left if (x >= 2 && map[y][x - 2] != 1) { map[y][x - 1] = 1; this.mazeGenerator(map, x - 2, y); } break; case 3: //right if (x < map[0].length - 2 && map[y][x + 2] != 1) { map[y][x + 1] = 1; this.mazeGenerator(map, x + 2, y); } break; } } }
Előre is köszönöm a segítséget! :)
Mutasd a teljes hozzászólást!
Akkor az implementáció jó, csak túl mély a rekurzió. Ezt kiküszöbölni nem tudod, csak az algoritmus vagy a rekurzió lecserélésével.
Pl. én még ebből a könyvből tanultam anno labirintust generálni: Spectrum - Könyvek - Etűdök személyi számítógépre (a linkelt fejezettől kicsit még görgetni kell lefele), eléggé más az algoritmus. A rekurziót meg úgy tudod kiküszöbölni, hogy helyette saját magad tárolod az éppen aktuális koordinátás és a megkevert iránytömböt is egy veremben (a tömbök push meg pop metódusa pont alkalmas erre), és akkor egy sima ciklusod lehet rekurzió helyett. Most így fejből hátultesztelő ciklusra gondolnék, ami addig fut, amíg a saját vermed ki nem ürül.
Mutasd a teljes hozzászólást!

Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd