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

Реклама


**Как получить V.I.P** (Перейти)
Чтобы заказать рекламу на Pro-Pawn.Ru, обращайтесь в Skype.
Баннерная реклама 200руб/мес, Текстовая 100руб/мес.
Показано с 1 по 8 из 8
  1. #1
    Аватар для m1n1vv
    Пользователь

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

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

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

    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
    Сообщений
    25
    Репутация:
    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
    Сообщений
    608
    Репутация:
    289 ±
    Цитата Сообщение от 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
    Адрес
    Восточный Мордор
    Сообщений
    3,931
    Репутация:
    1502 ±
    Цитата Сообщение от _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 поступят?
    Связаться со мной можно в личных сообщениях этой группы

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

    Steve Pavlina

  9. #7
    Аватар для VVWVV
    Проверенный

    Статус
    Оффлайн
    Регистрация
    09.07.2015
    Сообщений
    608
    Репутация:
    289 ±
    Цитата Сообщение от 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,037
    Репутация:
    705 ±
    Цитата Сообщение от 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)

Ваши права

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