Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Показано с 1 по 8 из 8
  1. #1
    Аватар для m1n1vv
    Пользователь

    Статус
    Оффлайн
    Регистрация
    09.09.2015
    Сообщений
    541
    Репутация:
    78 ±

    Как исправить рекурсию

    Привет. Пишу скрипт по мини режимам и столкнулся с проблемой. Рекурсия. Я хотел сделать, чтобы одинаковые игры подряд не запускались. Это можно сделать по другому?

    PHP код:
    public NewGoal()
    {
        
    games random(2)+1;
        
        if(
    games == old_games)
            return 
    NewGoal();
        
        
    old_games games;

        return 
    1;


  2. #2
    Аватар для _lizard
    Пользователь

    Статус
    Оффлайн
    Регистрация
    11.02.2016
    Адрес
    Геленджик
    Сообщений
    193
    Репутация:
    26 ±
    Ну так рекурсия и происходит потому, что рандомное число получается равно old_games несколько раз подряд

  3. #3
    Аватар для Item
    Пользователь

    Статус
    Оффлайн
    Регистрация
    13.02.2016
    Сообщений
    27
    Репутация:
    4 ±
    PHP код:
    public NewGoal()
    {
        
    replay:
        
    games random(2)+1;
        
        if(
    games == old_games)
            goto 
    replay;
        
        
    old_games games;

        return 
    1;


  4. Пользователь сказал cпасибо:
    DeimoS (31.08.2016)
  5. #4
    Аватар для _lizard
    Пользователь

    Статус
    Оффлайн
    Регистрация
    11.02.2016
    Адрес
    Геленджик
    Сообщений
    193
    Репутация:
    26 ±
    Цитата Сообщение от Item Посмотреть сообщение
    PHP код:
    public NewGoal()
    {
        
    replay:
        
    games random(2)+1;
        
        if(
    games == old_games)
            goto 
    replay;
        
        
    old_games games;

        return 
    1;

    А по сути, в чём разница то? Один и тот же код будет выполняться такое же количество раз при совпадении комбинации рандомного числа

  6. #5
    Аватар для VVWVV
    ?

    Статус
    Оффлайн
    Регистрация
    09.07.2015
    Сообщений
    731
    Репутация:
    353 ±
    Цитата Сообщение от Item Посмотреть сообщение
    PHP код:
    public NewGoal()
    {
        
    replay:
        
    games random(2)+1;
        
        if(
    games == old_games)
            goto 
    replay;
        
        
    old_games games;

        return 
    1;

    Оператор goto в коде - плохой признак.

    Ответ на вопрос ТС: Чем вас не устраивает подобный код:
    PHP код:
    public NewGoal()
    {
        do {} while ((
    games random(2) + 1) == old_games);
        
    old_games games;
        return 
    1;


  7. Пользователь сказал cпасибо:
    m1n1vv (31.08.2016)
  8. #6
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от _lizard Посмотреть сообщение
    А по сути, в чём разница то? Один и тот же код будет выполняться такое же количество раз при совпадении комбинации рандомного числа
    Автору это и нужно ведь, не? Его не устраивает то, что компилятор на рекурсию ругается и не более


    Цитата Сообщение от VVWVV Посмотреть сообщение
    Оператор goto в коде - плохой признак.

    Ответ на вопрос ТС: Чем вас не устраивает подобный код:
    PHP код:
    public NewGoal()
    {
        do {} while ((
    games random(2) + 1) == old_games);
        
    old_games games;
        return 
    1;

    Яркий пример того, как стереотипы заставляют писать извращенный код :3
    Давайте представим, что вместо
    PHP код:
    (games random(2) + 1) == old_games 
    будет другой код, с кучей условий и прочим. Как же тогда противники goto поступят?
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

  9. #7
    Аватар для VVWVV
    ?

    Статус
    Оффлайн
    Регистрация
    09.07.2015
    Сообщений
    731
    Репутация:
    353 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Яркий пример того, как стереотипы заставляют писать извращенный код :3
    Давайте представим, что вместо
    PHP код:
    (games random(2) + 1) == old_games 
    будет другой код, с кучей условий и прочим. Как же тогда противники goto поступят?
    Я не противник и не сторонник оператора goto. В некоторых случаях он может помочь, а в других, наоборот, навредить.

    Теперь о коде: в коде, предоставленном выше, я всего лишь показал, что вместо goto можно использовать цикл, т.е. я всего лишь упростил код.


    -DeimoS: Записать код в 1 строку != упростить его. ИМХО, goto тут гораздо эстетичнее смотрится. Но не будем оффтоп разводить.
    Последний раз редактировалось DeimoS; 01.09.2016 в 00:28.

  10. #8
    Аватар для ziggi
    Проверенный

    Статус
    Оффлайн
    Регистрация
    14.05.2015
    Сообщений
    1,181
    Репутация:
    790 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Яркий пример того, как стереотипы заставляют писать извращенный код :3
    Давайте представим, что вместо
    PHP код:
    (games random(2) + 1) == old_games 
    будет другой код, с кучей условий и прочим. Как же тогда противники goto поступят?
    Идея правильная, но код зачем-то "скукожен", вот так его следовало написать:
    PHP код:
    public NewGoal()
    {
        do {
            
    games random(2) + 1;
        } while (
    games == old_games);

        
    old_games games;
        return 
    1;

    P.S. Такие функции опасны, чисто теоретически сервер может повиснуть навсегда, ведь random возвращает любое случайное число и нам никто не гарантирует, что это число когда-нибудь будет отличаться от предыдущего. Конечно, вероятность этого крайне мала, но для реализации подобной системы лучше воспользоваться более безопасными методами.

 

 

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

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

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

Ваши права

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