Восходящая рекурсия на языке программирования Пролог,prolog


Добавил:DMT
Дата создания:15 января 2008, 1:46
Дата обновления:28 апреля 2008, 12:47
Просмотров:6870 последний сегодня, 4:00
Комментариев: 0
Восходящая рекурсия - промежуточные результаты вычисляются на некоторой стадии рекурсии, так что ответ строится постепенно и передается в виде параметра рабочей памяти до тех пор. пока не будет достигнута некоторая ( терминальная ) ситуация. К этому моменту ответ уже готов, и нужно передать его вызывающей функции верхнего уровня. Пример 1
Код на Lisp
  1. /*Вычисление длины списка с помощью восходящей рекурсии */
  2. domains
  3. sl = symbol*
  4. nl = integer*
  5. predicates
  6. list_len ( sl, integer )
  7. list_len ( nl, integer )
  8. l_l ( sl, integer, integer )
  9. l_l ( nl, integer, integer )
  10. clаuses
  11. list_len ( X, N ) :- l_l ( X, N, 0 ).
  12. l_l ( [ ], N, N ).
  13. l_l ( [ _ | R ], N, N1 ) :- N2 = N1 + 1, l_l ( R, N, N2 ).
При использовании обязательна ссылка на http://DMTSoft.ru
В некоторых случаях, при использовании рекурсии, результат вычисляется по-разному, следовательно, он зависит от выбора вида рекурсивной функции. Пример 2:
Код на Lisp
  1. /*Копирование списка с помощью разных видов рекурсии */
  2. // список копируется в обратном порядке – рекурсия восходящая.
  3. ucopy ( W, S ) : - cop ( W, [ ] ).
  4. cop ( [ ], S ).
  5. cop ( [ X | Y ], [ X | _ ] ) : - cop ( Y, S ).
При использовании обязательна ссылка на http://DMTSoft.ru
up