ВУЗ:
Составители:
Рубрика:
27
Разберем работу этой функции.
(MyCOPY ‘(a bc def))
L = ‘(a bc def)
L не пуст, значит возвращаем список, состоящий из первого элемента L и
копии хвоста списка:
(cons (car L) (MyCOPY (cdr L))
Причем, рекурсивный вызов MyCOPY будет сделан уже не для всего списка L, а
только для его «хвоста». Действительно, (cdr L) в этом случае будет ‘(bc def).
Нетрудно сообразить, что при каждом следующем вызове MyCOPY
передаваемый функции список будет меньше предыдущего на один элемент. Наконец,
когда функции будет передан пустой список, сработает условие ((null? L) nil), что
приведет к завершению работы этой функции.
Надо отметить, что к разработке рекурсивных функций следует относится
крайне тщательно, так как, например, в рассмотренной функции, отсутствие проверки
списка на пустоту привело бы к зацикливанию программы (бесконечной рекурсии).
Другие формы рекурсии (параллельная рекурсия)
Рекурсия может принимать различные формы. Так, можно выделить так
называемую «параллельную» рекурсию – когда тело функции f содержит вызов
некоторой функции g, несколько аргументов которой являются рекурсивными
вызовами функции f:
(define (f …
…(g … (f …) … (f …) …)
…)
Пример
Рассмотрим копирование списка на всех уровнях.
(define (copy-tree1 L)
(cond ((null? L) nil) ;условие окончания – пустой L
((atom? L) L) ;атом – возвращаем его же
(T (cons
(copy-tree1 (car L)) ;копия головы
(copy-tree1 (cdr L)) ;копия хвоста
))
)
)
Результат выполнения этого примера:
[0] (COPY-TREE1 '(A (B (C D))))
(A (B (C D)))
Как видно из этого примера, функция copy-tree1 «разбивает» список на голову и
хвост и вызывает сама себя по отдельности для головы и хвоста исходного списка.
ПРИМЕНЯЮЩИЕ И ОТОБРАЖАЮЩИЕ ФУНКЦИОНАЛЫ
Одним из основных типов функционалов являются функции, которые
позволяют вызывать другие функции, иными словами, применять функциональный
27 Разберем работу этой функции. (MyCOPY ‘(a bc def)) L = ‘(a bc def) L не пуст, значит возвращаем список, состоящий из первого элемента L и копии хвоста списка: (cons (car L) (MyCOPY (cdr L)) Причем, рекурсивный вызов MyCOPY будет сделан уже не для всего списка L, а только для его «хвоста». Действительно, (cdr L) в этом случае будет ‘(bc def). Нетрудно сообразить, что при каждом следующем вызове MyCOPY передаваемый функции список будет меньше предыдущего на один элемент. Наконец, когда функции будет передан пустой список, сработает условие ((null? L) nil), что приведет к завершению работы этой функции. Надо отметить, что к разработке рекурсивных функций следует относится крайне тщательно, так как, например, в рассмотренной функции, отсутствие проверки списка на пустоту привело бы к зацикливанию программы (бесконечной рекурсии). Другие формы рекурсии (параллельная рекурсия) Рекурсия может принимать различные формы. Так, можно выделить так называемую «параллельную» рекурсию – когда тело функции f содержит вызов некоторой функции g, несколько аргументов которой являются рекурсивными вызовами функции f: (define (f … …(g … (f …) … (f …) …) …) Пример Рассмотрим копирование списка на всех уровнях. (define (copy-tree1 L) (cond ((null? L) nil) ;условие окончания – пустой L ((atom? L) L) ;атом – возвращаем его же (T (cons (copy-tree1 (car L)) ;копия головы (copy-tree1 (cdr L)) ;копия хвоста )) ) ) Результат выполнения этого примера: [0] (COPY-TREE1 '(A (B (C D)))) (A (B (C D))) Как видно из этого примера, функция copy-tree1 «разбивает» список на голову и хвост и вызывает сама себя по отдельности для головы и хвоста исходного списка. ПРИМЕНЯЮЩИЕ И ОТОБРАЖАЮЩИЕ ФУНКЦИОНАЛЫ Одним из основных типов функционалов являются функции, которые позволяют вызывать другие функции, иными словами, применять функциональный
Страницы
- « первая
- ‹ предыдущая
- …
- 25
- 26
- 27
- 28
- 29
- …
- следующая ›
- последняя »