PDA

Просмотр полной версии : [Вопрос] Рекурсия



Vasya_Pupkin
30.03.2016, 18:23
Всем добрый вечер.
Помоги убрать рекурсию
я полазил почитал но смог только найти где скрывается рекурсия, а вот убрать ее не получается помогите.

unit_3(playerid)//рекурсия
{
new var_unit_stock_1[2] = 0, string[50], stringall[2000];
strcat(stringall, "{FFFFFF}Имя\tИд\tРанг\tВыговоры\n");
foreach (new i : Player)
{
if(PlayerInfo[i][pMember] != PlayerInfo[playerid][pMember] || PlayerInfo[i][pAdmin] > 0 || gPlayerLogged[i] != 1) continue;
var_unit_stock_1[0]++;
if((var_unit_stock_1[0]) >= (pTemp[playerid][var_unit_2]*15+15) || (var_unit_stock_1[0]) < (pTemp[playerid][var_unit_2]*15)) continue;
var_unit_stock_1[1]++;
format(string, sizeof(string), "{FFFFFF}%s\t%i\t%i\t%i\n", Name(i), i, PlayerInfo[i][pRank], PlayerInfo[i][pReprimands]);
strcat(stringall, string);
}
if(var_unit_stock_1[1] > 0)
{
strcat(stringall, "Следующая страница\n");
if(pTemp[playerid][var_unit_2] > 0) strcat(stringall, "Предыдущая страница\n");
format(string, sizeof(string), "{FF6F00}Список online игроков страница: %i", pTemp[playerid][var_unit_2]+1);
ShowPlayerDialog(playerid, 282, DIALOG_STYLE_TABLIST_HEADERS, string, stringall, "Выбрать", "Закрыть");
}
else
{
if(pTemp[playerid][var_unit_2] > 0) pTemp[playerid][var_unit_2]--, unit_3(playerid);
SendClientMessage(playerid, COLOR_GREY, "Игроки не найдены.");
}
return 1;
}


public unit_11(playerid)
{
new tmp[2] = 0, string[80], stringall[2430];
strcat(stringall, "{FFFFFF}Name\tОрганизация\tСтатус\n");
foreach (new i : Player)
{
if(PlayerInfo[i][pAdmin] > 0 || PlayerInfo[i][pLeader] <= 0) continue;
tmp[0]++;
if((tmp[0]) >= (pTemp[playerid][var_unit_11]*15+15) || (tmp[0]) < (pTemp[playerid][var_unit_11]*15)) continue;
tmp[1]++;
if(pTemp[i][pAFK] > 5) format(string, sizeof(string), "{FFFFFF}%s[%i]\t%s\tpause\n", Name(i), i, gFractionName[PlayerInfo[i][pLeader]-1]);
else format(string, sizeof(string), "{FFFFFF}%s[%i]\t%s\tonline\n", Name(i), i, gFractionName[PlayerInfo[i][pLeader]-1]);
strcat(stringall, string);
}
if(tmp[1] > 0)
{
strcat(stringall, "Следующая страница\n");
if(pTemp[playerid][var_unit_11] > 0) strcat(stringall, "Предыдущая страница");
format(string, sizeof(string), "{FF6F00}Список online лидеров организаций %i", pTemp[playerid][var_unit_11]+1);
ShowPlayerDialog(playerid, 1240, DIALOG_STYLE_TABLIST_HEADERS, string, stringall, "Выбрать", "Закрыть");
}
else
{
if(pTemp[playerid][var_unit_11] > 0)
{
pTemp[playerid][var_unit_11]--;
unit_11(playerid);
}
SendClientMessage(playerid, COLOR_GREY, "Лидеры не найдены.");
}
return 1;
}


unit_14(playerid)
{
new tmp[2] = 0, string[60], stringall[1830];
strcat(stringall, "{FFFFFF}Name\tУровень\tСтатус\n");
foreach (new i : Player)
{
if(gPlayerLogged[i] == 0 || PlayerInfo[i][pAdmin] < 1) continue;
tmp[0]++;
if((tmp[0]) >= (pTemp[playerid][var_unit_13]*15+15) || (tmp[0]) < (pTemp[playerid][var_unit_13]*15)) continue;
tmp[1]++;
if(pTemp[i][pAFK] > 5) format(string, sizeof(string), "{FFFFFF}%s[%i]\t%i\tpause\n", Name(i), i, PlayerInfo[i][pAdmin]);
else format(string, sizeof(string), "{FFFFFF}%s[%i]\t%i\tonline\n", Name(i), i, PlayerInfo[i][pAdmin]);
strcat(stringall, string);
}
if(tmp[1] > 0)
{
strcat(stringall, "Следующая страница\n");
if(pTemp[playerid][var_unit_13] > 0) strcat(stringall, "Предыдущая страница");
format(string, sizeof(string), "{FF6F00}Список online администраторов %i", pTemp[playerid][var_unit_13]+1);
ShowPlayerDialog(playerid, 143, DIALOG_STYLE_TABLIST_HEADERS, string, stringall, "Выбрать", "Закрыть");
}
else
{
if(pTemp[playerid][var_unit_13] > 0)
{
pTemp[playerid][var_unit_13]--;
unit_14(playerid);
}
SendClientMessage(playerid, COLOR_GREY, "Администраторы не найдены.");
}
return 1;
}

DeimoS
30.03.2016, 19:26
В этом случае рекурсия совсем не смертельна, ибо она подконтрольна (в программировании очень часто рекурсию используют при реализации тех или иных систем).
Хотя, как я понимаю, ты просто хочешь, чтоб компилятор смог отобразить потребление стека. В общем, можно использовать goto:

unit_3(playerid)//рекурсия
{
goto_unit_3:
new var_unit_stock_1[2] = 0, string[50], stringall[2000];
strcat(stringall, "{FFFFFF}Имя\tИд\tРанг\tВыговоры\n");
foreach (new i : Player)
{
if(PlayerInfo[i][pMember] != PlayerInfo[playerid][pMember] || PlayerInfo[i][pAdmin] > 0 || gPlayerLogged[i] != 1) continue;
var_unit_stock_1[0]++;
if((var_unit_stock_1[0]) >= (pTemp[playerid][var_unit_2]*15+15) || (var_unit_stock_1[0]) < (pTemp[playerid][var_unit_2]*15)) continue;
var_unit_stock_1[1]++;
format(string, sizeof(string), "{FFFFFF}%s\t%i\t%i\t%i\n", Name(i), i, PlayerInfo[i][pRank], PlayerInfo[i][pReprimands]);
strcat(stringall, string);
}
if(var_unit_stock_1[1] > 0)
{
strcat(stringall, "Следующая страница\n");
if(pTemp[playerid][var_unit_2] > 0) strcat(stringall, "Предыдущая страница\n");
format(string, sizeof(string), "{FF6F00}Список online игроков страница: %i", pTemp[playerid][var_unit_2]+1);
ShowPlayerDialog(playerid, 282, DIALOG_STYLE_TABLIST_HEADERS, string, stringall, "Выбрать", "Закрыть");
}
else
{
if(pTemp[playerid][var_unit_2] > 0)
{
pTemp[playerid][var_unit_2]--;
goto goto_unit_3;
}
SendClientMessage(playerid, COLOR_GREY, "Игроки не найдены.");
}
return 1;
}


public unit_11(playerid)
{
goto_unit_11:
new tmp[2] = 0, string[80], stringall[2430];
strcat(stringall, "{FFFFFF}Name\tОрганизация\tСтатус\n");
foreach (new i : Player)
{
if(PlayerInfo[i][pAdmin] > 0 || PlayerInfo[i][pLeader] <= 0) continue;
tmp[0]++;
if((tmp[0]) >= (pTemp[playerid][var_unit_11]*15+15) || (tmp[0]) < (pTemp[playerid][var_unit_11]*15)) continue;
tmp[1]++;
if(pTemp[i][pAFK] > 5) format(string, sizeof(string), "{FFFFFF}%s[%i]\t%s\tpause\n", Name(i), i, gFractionName[PlayerInfo[i][pLeader]-1]);
else format(string, sizeof(string), "{FFFFFF}%s[%i]\t%s\tonline\n", Name(i), i, gFractionName[PlayerInfo[i][pLeader]-1]);
strcat(stringall, string);
}
if(tmp[1] > 0)
{
strcat(stringall, "Следующая страница\n");
if(pTemp[playerid][var_unit_11] > 0) strcat(stringall, "Предыдущая страница");
format(string, sizeof(string), "{FF6F00}Список online лидеров организаций %i", pTemp[playerid][var_unit_11]+1);
ShowPlayerDialog(playerid, 1240, DIALOG_STYLE_TABLIST_HEADERS, string, stringall, "Выбрать", "Закрыть");
}
else
{
if(pTemp[playerid][var_unit_11] > 0)
{
pTemp[playerid][var_unit_11]--;
goto goto_unit_11;
}
SendClientMessage(playerid, COLOR_GREY, "Лидеры не найдены.");
}
return 1;
}


unit_14(playerid)
{
goto_unit_14:
new tmp[2] = 0, string[60], stringall[1830];
strcat(stringall, "{FFFFFF}Name\tУровень\tСтатус\n");
foreach (new i : Player)
{
if(gPlayerLogged[i] == 0 || PlayerInfo[i][pAdmin] < 1) continue;
tmp[0]++;
if((tmp[0]) >= (pTemp[playerid][var_unit_13]*15+15) || (tmp[0]) < (pTemp[playerid][var_unit_13]*15)) continue;
tmp[1]++;
if(pTemp[i][pAFK] > 5) format(string, sizeof(string), "{FFFFFF}%s[%i]\t%i\tpause\n", Name(i), i, PlayerInfo[i][pAdmin]);
else format(string, sizeof(string), "{FFFFFF}%s[%i]\t%i\tonline\n", Name(i), i, PlayerInfo[i][pAdmin]);
strcat(stringall, string);
}
if(tmp[1] > 0)
{
strcat(stringall, "Следующая страница\n");
if(pTemp[playerid][var_unit_13] > 0) strcat(stringall, "Предыдущая страница");
format(string, sizeof(string), "{FF6F00}Список online администраторов %i", pTemp[playerid][var_unit_13]+1);
ShowPlayerDialog(playerid, 143, DIALOG_STYLE_TABLIST_HEADERS, string, stringall, "Выбрать", "Закрыть");
}
else
{
if(pTemp[playerid][var_unit_13] > 0)
{
pTemp[playerid][var_unit_13]--;
goto goto_unit_14;
}
SendClientMessage(playerid, COLOR_GREY, "Администраторы не найдены.");
}
return 1;
}

Только если сам решишь использовать goto в будущем, хорошенько разберись в принципах его работы, ибо с его помощью можно как до краша довести мод, так и к зависанию привести его

Vasya_Pupkin
30.03.2016, 19:56
Большое спасибо за помощь