Программирование на языке Автолисп. Куляс О.С. - 36 стр.

UptoLike

Составители: 

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 меняется при переходе на следующии уровень. Значения прдыдущего
уровня сохраняются, поскольку связи переменных ассоциируются с
уровнем. Значение предыдущих уровней скрыты до тех пор, пока на них
не вернется управление, после этого старые связи вновь становятся
активными. В приведенном примере после возврата на предыдущие
уровни эти связи не используются.