ВУЗ:
Составители:
Рубрика:
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
- …
- следующая ›
- последняя »