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

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

  1. WinPooh
    Оффлайн

    WinPooh В.М. Staff Member

    Репутация:
    95
    Забавы ради и упражнения для, решил попробовать итеративный поиск вместо рекурсивного. Для чистоты эксперимента переписал не основную функцию, а 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
    Оффлайн

    NS Нефёдов Сергей баннер

    Репутация:
    3
    :) Я шутил когда говорил про отказ от рекурсии :)
    У меня сейчас просто передается больше 10 параметров... От этого я избавлюсь.
    А замедлить рекурсия сильно не может. Так как после последнего рекурсивного вызова идёт оценка, а она явно занимает больше времени чем вызов.
     
  3. WinPooh
    Оффлайн

    WinPooh В.М. Staff Member

    Репутация:
    95
    А ведь есть какие-то реальные итеративные программы, и довольно сильные. Названий не помню, но читал про какую-то.
     
  4. NS
    Оффлайн

    NS Нефёдов Сергей баннер

    Репутация:
    3
    Просто кому-то так удобней писать - принципиальной разницы нет.
    Но в реальных шахматных программах рекурсивный вызов Search производится из нескольких мест.
    Соответственно если делать интерактивно (цикл) - то придется ставить Case либо Goto - что немного ухудшает читабельность программы.
     
  5. WinPooh
    Оффлайн

    WinPooh В.М. Staff Member

    Репутация:
    95
    Вспомнил. Итерация вместо рекурсии требуется при реализации поиска на SMP-системах. Так что буду иметь её в виду при переписывании Греки...
     
  6. atoku
    Оффлайн

    atoku Модератор

    Репутация:
    0
    Не обязательно параллельные системы должны быть итеративные... Может быть и рекурсия.
     
  7. NO
    Оффлайн

    NO Учаcтник

    Репутация:
    0
    Есть еще continuations.
    Кто не знает, грубо говоря, это кусок стека в котором лежит набор вложенных и уже частично выполненных вызовов. Его можно сохранить, а потом ставить указатель стека не него, сразу оказываясь в глубине функций, без выполнения множества call, push bp и т.п.
     
  8. Сергей Марков
    Оффлайн

    Сергей Марков Учаcтник

    Репутация:
    0
    На самом деле эффективность сравнительный выигрыш от использования итеративного подхода определяется эффективностью компилятора. Если компилятор все правильно оптимизирует, то выигрыша быть не должно :)