Переполнение стека при переборе вариантов
Есть три игрока: A,B,C. У каждого из них есть число. Они ходят по очереди, за ход игрок может вычесть из числа другого игрока 1. Когда у одного из игроков число становиться равным 0, он получает 0 баллов за игру, а другие игроки:
Если у одного из двух ост. число больше, чем у другого, он получает 2 балла, у другого-1 балл.
При равном количестве они получают по 2 очка. Код должен найти, как следует играть, чтобы получить
максимальное количество баллов.
function bestGame(a,b,c){
function winner(a,b,c){
if(a==0){
if(b>c){
return [0,2,1];
}
else if(b<c){
return [0,1,2];
}
else{
return [0,3,3];
}
}
if(b==0){
if(a>c){
return [2,0,1];
}
else if(c<a){
return [1,0,2];
}
else{
return [3,0,3];
}
}
if(c==0){
if(a>b){
return [2,1,0];
}
else if(b<a){
return [1,2,0];
}
else{
return [3,3,0];
}
}
}
function best_gameA(a,b,c,h){//Стратегия A.
if(a*b*c==0){
return [winner(a,b,c),h];
}
var b1=[-1,-1,-1];//Количество баллов у трёх игроков.
var h1="";//История игры
var b=best_gameB(a,b-1,c,h+[a,b-1,c]);
if(b[0][0]>b1){
b1=b[0];
h1=h+[a,b-1,c];
}
b=best_gameB(a,b,c-1,h+[a,b,c-1]);
if(b[0][0]>b1){
b1=b[0];
h=b[1]+[a,b,c-1];
}
return [b1,h];
}
function best_gameB(a,b,c,h){//Стратегия B
if(a*b*c==0){
return [winner(a,b,c),h];
}
var b1=[-1,-1,-1];
var h1="";
var b=best_gameC(a-1,b,c,h+[a-1,b,c]);
if(b[0][1]>b1){
b1=b[0];
h1=h+[a-1,b,c];
}
b=best_gameC(a,b,c-1,h+[a,b,c-1]);
if(b[0][1]>b1){
b1=b[0];
h=b[1]+[a,b,c-1];
}
return [b1,h];
}
function best_gameC(a,b,c,h){//Стратегия C
if(a*b*c==0){
return [winner(a,b,c),h];
}
var b1=[-1,-1,-1];
var h1="";
var b=best_gameA(a-1,b,c,h+[a-1,b,c]);
if(b[0][2]>b1){
b1=b[0];
h1=h+[a-1,b,c];
}
b=best_gameA(a,b-1,c,h+[a,b-1,c]);
if(b[0][2]>b1){
b1=b[0];
h=b[1]+[a,b,c-1];
}
return [b1,h];
}
return best_gameA(a,b,c,"");
}
alert(bestGame(2,3,4));
Проблема в том, что стек переполняется.
Источник: Stack Overflow на русском