Лисп/Рекурсия: различия между версиями

Содержимое удалено Содержимое добавлено
Нет описания правки
Нет описания правки
Строка 12:
>> (new-copy-list '(a b (c d))) => (A B (C D))
</source>
Функция, которую мы обозвали new-copy-list, чтобы отличать не переопределять встроенную copy-lisplist, создает физическую копию списка. На этом примере видно, что у рекурсивной функции как миминум две ветви, причем одна обязательно ведет к завершению вычислений. В каждой ветви рекурсии функция строит список из головного элемента (car list) и списка, который получается в результате вызова той же функции new-copy-list с аргументом (cdr list) - хвостом исходного списка. Что получается в результате такого "внутреннего" вызова - догадайтесь :-) Так продолжается до тех пор, пока не будет истинным (null list), то есть аргумент вызываемой функции не станет пустым списком. В этом случае вычисления завершаются.
Это самый простой пример рекурсии, к тому же он работает со списками и хорошо подходит для описания рекурсии в лиспе. Так же можно было бы привести рекурсивные функции для вычисления факториала, чисел фибоначчи etc, но их вы найдете в любом пособии по теории рекурсии и даже в книжках типа "математика для домохозяек и носорогов".