Итерация vs. Рекурсия

Discussion in 'Машинное отделение' started by WinPooh, 4 Aug 2006.

  1. TopicStarter Overlay

    WinPooh В.М.

    • Команда форума
    Member Since:
    13.02.2006
    Message Count:
    9.491
    Likes Received:
    3.120
    Репутация:
    95
    Location:
    Москва
    Оффлайн
    Забавы ради и упражнения для, решил попробовать итеративный поиск вместо рекурсивного. Для чистоты эксперимента переписал не основную функцию, а perft-тест: там кроме генерации ходов, проверки на легальность и собственно рекурсивных вызовов ничего нет. Поэтому выигрыш от замены рекурсии на итерации в реальном поиске будет заведомо ниже, чем в perft().

    Результаты таковы:

    Code:
    из начальной позиции
    
    depth     time-iter    time-recur
    4         0.047        0.047
    5         1.093        1.093
    6         26.859       27.3
    
    из другой позиции
    
    depth     time-iter    time-recur
    4         1.046        1.047
    5         47.73        48.0
    Предварительные выводы:

    1. выигрыш по скорости составляет в моей программе в лучшем случае единицы процентов
    2. затраты на рекурсивный вызов функций не являются узким местом в поиске
    3. если учесть усложнение кода и процесса отладки, переход с рекурсии на итерации не является для меня целесообразным

    Дополнительный фактор, который может повлиять на результаты в поиске по сравнению с perft() - количество аргументов, передаваемых при вызове функции. В perft() аргументов три, в реальном поиске их у меня - 5 или 6.
    Врочем, предполагаю, что решающего значения это не имеет.
  2. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Member Since:
    02.05.2006
    Message Count:
    6.811
    Likes Received:
    96
    Репутация:
    3
    Location:
    Санкт-Петербург
    Оффлайн
    :) Я шутил когда говорил про отказ от рекурсии :)
    У меня сейчас просто передается больше 10 параметров... От этого я избавлюсь.
    А замедлить рекурсия сильно не может. Так как после последнего рекурсивного вызова идёт оценка, а она явно занимает больше времени чем вызов.
  3. TopicStarter Overlay

    WinPooh В.М.

    • Команда форума
    Member Since:
    13.02.2006
    Message Count:
    9.491
    Likes Received:
    3.120
    Репутация:
    95
    Location:
    Москва
    Оффлайн
    А ведь есть какие-то реальные итеративные программы, и довольно сильные. Названий не помню, но читал про какую-то.
  4. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Member Since:
    02.05.2006
    Message Count:
    6.811
    Likes Received:
    96
    Репутация:
    3
    Location:
    Санкт-Петербург
    Оффлайн
    Просто кому-то так удобней писать - принципиальной разницы нет.
    Но в реальных шахматных программах рекурсивный вызов Search производится из нескольких мест.
    Соответственно если делать интерактивно (цикл) - то придется ставить Case либо Goto - что немного ухудшает читабельность программы.
  5. TopicStarter Overlay

    WinPooh В.М.

    • Команда форума
    Member Since:
    13.02.2006
    Message Count:
    9.491
    Likes Received:
    3.120
    Репутация:
    95
    Location:
    Москва
    Оффлайн
    Вспомнил. Итерация вместо рекурсии требуется при реализации поиска на SMP-системах. Так что буду иметь её в виду при переписывании Греки...
  6. atoku Модератор

    • Команда форума
    Member Since:
    05.02.2006
    Message Count:
    2.949
    Likes Received:
    9
    Репутация:
    0
    Location:
    USA
    Оффлайн
    Не обязательно параллельные системы должны быть итеративные... Может быть и рекурсия.
  7. NO Учаcтник

    • Участник
    Member Since:
    01.05.2006
    Message Count:
    31
    Likes Received:
    0
    Репутация:
    0
    Оффлайн
    Есть еще continuations.
    Кто не знает, грубо говоря, это кусок стека в котором лежит набор вложенных и уже частично выполненных вызовов. Его можно сохранить, а потом ставить указатель стека не него, сразу оказываясь в глубине функций, без выполнения множества call, push bp и т.п.
  8. Сергей Марков Учаcтник

    • Участник
    Member Since:
    13.05.2006
    Message Count:
    136
    Likes Received:
    6
    Репутация:
    0
    Оффлайн
    На самом деле эффективность сравнительный выигрыш от использования итеративного подхода определяется эффективностью компилятора. Если компилятор все правильно оптимизирует, то выигрыша быть не должно :)

Share This Page