ВУЗ:
Составители:
Рубрика:
36
Ее решение можно рекурсивно свести к функции , решающей
первоначальную задачу.
Пронаблюдав с помощью трассировки за вычислением функции
MEMB можно понять принцип работы программы:
(trace MEMB) ; включение трассировки
(MEMB) ; загрука функции
(MEMB 'c '(a b c d)) ; вызов функции
MEMB : ; вызов уровня 1
A = C
L = (A B C D)
MEMB : ; вызов уровня 2
A = C
L = (B C D)
MEMB : ; вызов уровня 3
A = C
L = (C D)
MEMB = (C D) ; значение уровня 3
MEMB = (C D) ; значение
уровня 2
MEMB = (C D) ; значение уровня 1
(C D) ; значение формы
На первых двух уровнях рекурсии вычисления осуществляются по
третьей, рекурсивной ветви. В рекурсивном вызове первым аргументом
является С, так как искомый элемент на каждом шаге один и тот же.
Вторым аргументом берется хвост списка текущего уровня (CDR L).
На третьем уровне значением предиката (EQ L (CAR L) A)
становится Т,
поэтому на этом уровне значением всего вызова станет
значение соответствующего результирующего выражение L=(C D). Это
значение возвращается на предыдущий уровень, где оно будет
значением вызова MEMB в рекурсивной ветви и, таким образом, станет
значением всего вызова на втором уровне. Потом это значение
возвращается далее на уровень и, в конце концов, выводится
пользователю.
В процессе
спуска по ходу рекурсии на более низкие уровни
значение параметра А не меняется , в то время как значения параметра
L меняется при переходе на следующии уровень. Значения прдыдущего
уровня сохраняются, поскольку связи переменных ассоциируются с
уровнем. Значение предыдущих уровней скрыты до тех пор, пока на них
не вернется управление, после этого
старые связи вновь становятся
активными. В приведенном примере после возврата на предыдущие
уровни эти связи не используются.
36
Ее решение можно рекурсивно свести к функции , решающей
первоначальную задачу.
Пронаблюдав с помощью трассировки за вычислением функции
MEMB можно понять принцип работы программы:
(trace MEMB) ; включение трассировки
(MEMB) ; загрука функции
(MEMB 'c '(a b c d)) ; вызов функции
MEMB : ; вызов уровня 1
A=C
L = (A B C D)
MEMB : ; вызов уровня 2
A=C
L = (B C D)
MEMB : ; вызов уровня 3
A=C
L = (C D)
MEMB = (C D) ; значение уровня 3
MEMB = (C D) ; значение уровня 2
MEMB = (C D) ; значение уровня 1
(C D) ; значение формы
На первых двух уровнях рекурсии вычисления осуществляются по
третьей, рекурсивной ветви. В рекурсивном вызове первым аргументом
является С, так как искомый элемент на каждом шаге один и тот же.
Вторым аргументом берется хвост списка текущего уровня (CDR L).
На третьем уровне значением предиката (EQ L (CAR L) A)
становится Т, поэтому на этом уровне значением всего вызова станет
значение соответствующего результирующего выражение L=(C D). Это
значение возвращается на предыдущий уровень, где оно будет
значением вызова MEMB в рекурсивной ветви и, таким образом, станет
значением всего вызова на втором уровне. Потом это значение
возвращается далее на уровень и, в конце концов, выводится
пользователю.
В процессе спуска по ходу рекурсии на более низкие уровни
значение параметра А не меняется , в то время как значения параметра
L меняется при переходе на следующии уровень. Значения прдыдущего
уровня сохраняются, поскольку связи переменных ассоциируются с
уровнем. Значение предыдущих уровней скрыты до тех пор, пока на них
не вернется управление, после этого старые связи вновь становятся
активными. В приведенном примере после возврата на предыдущие
уровни эти связи не используются.
Страницы
- « первая
- ‹ предыдущая
- …
- 34
- 35
- 36
- 37
- 38
- …
- следующая ›
- последняя »
