Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Показано с 1 по 3 из 3

Тема: Рекурсия

  1. #1
    Аватар для Vasya_Pupkin
    Пользователь

    Статус
    Оффлайн
    Регистрация
    13.02.2016
    Сообщений
    77
    Репутация:
    0 ±

    Рекурсия

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

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

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


  2. #2
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    В этом случае рекурсия совсем не смертельна, ибо она подконтрольна (в программировании очень часто рекурсию используют при реализации тех или иных систем).
    Хотя, как я понимаю, ты просто хочешь, чтоб компилятор смог отобразить потребление стека. В общем, можно использовать goto:
      Открыть/закрыть
    PHP код:
    unit_3(playerid)//рекурсия 

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

    PHP код:
    public unit_11(playerid

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

    PHP код:
    unit_14(playerid

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



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

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  3. Пользователь сказал cпасибо:
    Vasya_Pupkin (30.03.2016)
  4. #3
    Аватар для Vasya_Pupkin
    Пользователь

    Статус
    Оффлайн
    Регистрация
    13.02.2016
    Сообщений
    77
    Репутация:
    0 ±
    Большое спасибо за помощь

 

 

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •