XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов> Jass
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Ответ
 
FatalBlade

offline
Опыт: 7,398
Активность:
Рекурсивные функции (Правда ли что самые быстрые?)
Мне как то раз сказали что рекурсивные функции работают быстрее любых циклов для любых целей. Правда ли это? Может я и не правильно понял что значит рекурсия, но по моему вот это подходит под описание:
function CheckRange takes unit u, unit un returns real
     if IsUnitInRange( un, u, 2000.0 ) then
       if IsUnitInRange( un, u, 1500.0 ) then
         if IsUnitInRange( un, u, 1000.0 ) then
           return 1.0
         endif
         return 0.8
       endif
      return 0.6
     else
      return 0.4
     endif
endfunction

set y = CheckRange( un, u )
Это кофицент награды золота за крипов. Чем дальше убитый вражеский юнит от вашего юнита, тем меньше кофицент. Тут правда есть конкретные значения, 1000, 1500, 2000.
Теперь вот вам отрывок кода, который выполняет то же самое, только по другому:
      set dx = GetWidgetX(un) - GetWidgetX(u)
      set dy = GetWidgetY(un) - GetWidgetY(u)
      set d = SquareRoot( dx * dx + dy * dy )
      if d < 1000 then
         set y = 1.00
      elseif d <= 1500 and d > 1000 then
         set y = 0.80
      elseif d <= 2000 and d > 1500 then
         set y = 0.60
      elseif d > 2000 then
         set y = 0.40
      endif
И вот мой вопрос - что работает быстрее? Что из них лучше для производительности?
оформил код как надо alpha

Отредактировано alpha, 02.02.2012 в 21:10.
Старый 02.02.2012, 21:00
Hellfim
Новичок
offline
Опыт: 79,707
Активность:
FatalBlade, это не рекурсия.
Рекурсия:
function r takes integer a, integer b returns integer
    if a==547 then
        return 1
    endif
    return r(a+b,b)
endfunction

...

real z=r(0,0)
Hellfim добавил:
Я бы пользовался этим:
      set dx = GetWidgetX(un) - GetWidgetX(u)
      set dy = GetWidgetY(un) - GetWidgetY(u)
      set d = SquareRoot( dx * dx + dy * dy )
      if d < 1000 then
         set y = 1.00
      elseif d <= 1500 then
         set y = 0.80
      elseif d <= 2000 then
         set y = 0.60
      elseif d > 2000 then
         set y = 0.40
      endif
Старый 02.02.2012, 22:00
ScorpioT1000
Работаем
offline
Опыт: отключен
Мне как то раз сказали что рекурсивные функции работают быстрее любых циклов для любых целей.
Ложь. Мало того, что они работают во много раз медленнее ("много" зависит, насколько высокоуровневый язык), так ещё и жрут кучу памяти, а при большой глубине вызывают переполнение стека.
ScorpioT1000 добавил:
и да,
FatalBlade, это не рекурсия.
+1
Старый 02.02.2012, 22:51
FatalBlade

offline
Опыт: 7,398
Активность:
А вообще, не в этом случае, а просто, когда нужно проверить расстояние между юнитами, что лучше юзать:
________________________________________________
call IsUnitInRange( un, u, 2000.0 )
________________________________________________
или
________________________________________________
set dx = GetWidgetX(un) - GetWidgetX(u)
set dy = GetWidgetY(un) - GetWidgetY(u)
set d = SquareRoot( dx * dx + dy * dy )
if d < 2000 then
endif
________________________________________________

Отредактировано FatalBlade, 02.02.2012 в 23:23.
Старый 02.02.2012, 23:00
alpha

offline
Опыт: 7,387
Активность:
Проверь сам, есть специальное дополнение к варкрафту для измерения скорости срабатывания алгоритма.
Мне код каждого твоего поста приводить в нормальный вид?
Старый 02.02.2012, 23:31
ScorpioT1000
Работаем
offline
Опыт: отключен
FatalBlade, напиши отдельно функцию для этого и используй её везде. Т.е. второе, но вместо 2000 будет входной параметр, после "if" - "return true", а в конце - "return false".
И принято не "<", а "<=" писать, когда проверяется что-то в какой-то области.
Старый 02.02.2012, 23:36
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

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

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 10:30.