PDA

Просмотр полной версии : [Вопрос] Как исправить рекурсию



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


public NewGoal()
{
games = random(2)+1;

if(games == old_games)
return NewGoal();

old_games = games;

return 1;
}

_lizard
31.08.2016, 23:07
Ну так рекурсия и происходит потому, что рандомное число получается равно old_games несколько раз подряд

Item
31.08.2016, 23:13
public NewGoal()
{
replay:
games = random(2)+1;

if(games == old_games)
goto replay;

old_games = games;

return 1;
}

_lizard
31.08.2016, 23:15
public NewGoal()
{
replay:
games = random(2)+1;

if(games == old_games)
goto replay;

old_games = games;

return 1;
}

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

VVWVV
31.08.2016, 23:23
public NewGoal()
{
replay:
games = random(2)+1;

if(games == old_games)
goto replay;

old_games = games;

return 1;
}

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

Ответ на вопрос ТС: Чем вас не устраивает подобный код:


public NewGoal()
{
do {} while ((games = random(2) + 1) == old_games);
old_games = games;
return 1;
}

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

Автору это и нужно ведь, не? Его не устраивает то, что компилятор на рекурсию ругается и не более



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

Ответ на вопрос ТС: Чем вас не устраивает подобный код:


public NewGoal()
{
do {} while ((games = random(2) + 1) == old_games);
old_games = games;
return 1;
}


Яркий пример того, как стереотипы заставляют писать извращенный код :3
Давайте представим, что вместо

(games = random(2) + 1) == old_games
будет другой код, с кучей условий и прочим. Как же тогда противники goto поступят?

VVWVV
01.09.2016, 00:20
Яркий пример того, как стереотипы заставляют писать извращенный код :3
Давайте представим, что вместо

(games = random(2) + 1) == old_games
будет другой код, с кучей условий и прочим. Как же тогда противники goto поступят?

Я не противник и не сторонник оператора goto. В некоторых случаях он может помочь, а в других, наоборот, навредить.

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


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

ziggi
01.09.2016, 01:05
Яркий пример того, как стереотипы заставляют писать извращенный код :3
Давайте представим, что вместо

(games = random(2) + 1) == old_games
будет другой код, с кучей условий и прочим. Как же тогда противники goto поступят?

Идея правильная, но код зачем-то "скукожен", вот так его следовало написать:

public NewGoal()
{
do {
games = random(2) + 1;
} while (games == old_games);

old_games = games;
return 1;
}

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