Ремонт принтеров, сканнеров, факсов и остальной офисной техники


назад Оглавление вперед




[149]

gcd

(test (op =) (reg b) (const 0)) (branch (label gcd-done)) (assign t (op rem) (reg a) (reg b)) (assign a (reg b)) (assign b (reg t)) (goto (label gcd)) gcd-done

(test (op =) (reg continue) (const 0)) (branch (label after-gcd-1)) (goto (label after-gcd-2))

;; Прежде, чем перейти к gcd из первого места, где ;; он нужен, заносим 0 в регистр continue

(assign continue (const 0))

(goto (label gcd)) after-gcd-1

;; Перед вторым использованием gcd помещаем 1 в регистр continue. (assign continue (const 1)) (goto (label gcd)) after-gcd-2

Рис. 5.9: Использование регистра continue ради избежания повторяющейся последовательности команд с рисунка 5.8.


gcd

(test (op =) (reg b) (const 0)) (branch (label gcd-done)) (assign t (op rem) (reg a) (reg b)) (assign a (reg b)) (assign b (reg t)) (goto (label gcd)) gcd-done (goto (reg continue))

;; Перед вызовом gcd заносим в continue ;; метку, на которую gcd должен вернуться.

(assign continue (label after-gcd-1))

(goto (label gcd)) after-gcd-1

;; Второй вызов gcd, с другим продолжением. (assign continue (label after-gcd-2)) (goto (label gcd)) after-gcd-2

Рис. 5.10: Присваивание регистру continue меток упрощает и обобщает стратегию с рисунка 5.9.


(* (factorial (- n 1)) n)))

Как мы видим из этой процедуры, вычисление n! требует вычисления (n - 1)!. Машина НОД, которая моделирует процедуру

(define (gcd a b)

(if (= b 0)

a

(gcd b (remainder a b))))

также должна была вычислять НОД других чисел, помимо начальных значений. Однако между машиной НОД, которая сводит исходное вычисление к вычислению другого НОД, и factorial, в котором нужно вычислить другой факториал как подзадачу, есть существенная разница. В машине НОД ответ, выдаваемый новым вычислением НОД - это и есть ответ на исходную задачу. Чтобы вычислить следующий НОД, мы просто помещаем новые аргументы во входные регистры машины и заново используем ее пути данных, прогоняя ту же самую последовательность команд контроллера. Когда машина заканчивает решение последней задачи НОД, исходное вычисление также заканчивается.

В случае с факториалом (и в любом другом рекурсивном процессе) ответ на подзадачу-факториал не является решением общей задачи. Значение, полученное для (n - 1)!, требуется еще домножить на n, чтобы получить окончательный ответ. Если мы попытаемся сымитировать решение задачи НОД и решить подзадачу-факториал, уменьшив регистр n и запустив машину заново, у нас больше не будет старого значения n, на которое можно было бы домножить результат. Для решения подзадачи нам бы потребовалась еще одна факториальная машина. Во втором вычислении факториала также есть подзадача-факториал, для нее требуется третья факториальная машина, и так далее. Поскольку внутри каждой факториальной машины содержится другая факториальная машина, в общей машине должно содержаться бесконечное гнездо вложенных друг в друга машин, а следовательно, ее нельзя построить из заранее заданного конечного числа деталей.

Тем не менее реализовать факториальный процесс в виде регистровой машины можно, если использовать одни и те же компоненты для всех встроенных ее экземпляров. А именно, машина, которая вычисляет n!, должна использовать одни и те же детали для работы над подзадачей вычисления (n - 1)!, (n - 2)! и так далее. Такое построение возможно, поскольку, несмотря на то, что факто-риальный процесс требует для своего вычисления неограниченное число одинаковых машин, в каждый момент времени только одна из этих машин активна. Когда машина встречает рекурсивную подзадачу, она может остановить работу над основной задачей, использовать свои физические детали для решения подзадачи, а затем продолжить остановленное вычисление.

Содержимое регистров внутри подзадачи будет отличаться от их значения в главной задаче. (В нашем случае регистр n уменьшается на единицу.) Чтобы суметь продолжить остановленное вычисление, машина должна сохранить содержимое всех регистров, которые ей понадобятся после того, как подзадача будет решена, а затем восстановить их, прежде чем возобновить работу. В случае с факториалом мы сохраним старое значение n и восстановим его, когда закончим вычисление факториала от уменьшенного значения регистра n.2

2Казалось бы, незачем сохранять старое n; после того, как мы его уменьшим на единицу и



[стр.Начало] [стр.1] [стр.2] [стр.3] [стр.4] [стр.5] [стр.6] [стр.7] [стр.8] [стр.9] [стр.10] [стр.11] [стр.12] [стр.13] [стр.14] [стр.15] [стр.16] [стр.17] [стр.18] [стр.19] [стр.20] [стр.21] [стр.22] [стр.23] [стр.24] [стр.25] [стр.26] [стр.27] [стр.28] [стр.29] [стр.30] [стр.31] [стр.32] [стр.33] [стр.34] [стр.35] [стр.36] [стр.37] [стр.38] [стр.39] [стр.40] [стр.41] [стр.42] [стр.43] [стр.44] [стр.45] [стр.46] [стр.47] [стр.48] [стр.49] [стр.50] [стр.51] [стр.52] [стр.53] [стр.54] [стр.55] [стр.56] [стр.57] [стр.58] [стр.59] [стр.60] [стр.61] [стр.62] [стр.63] [стр.64] [стр.65] [стр.66] [стр.67] [стр.68] [стр.69] [стр.70] [стр.71] [стр.72] [стр.73] [стр.74] [стр.75] [стр.76] [стр.77] [стр.78] [стр.79] [стр.80] [стр.81] [стр.82] [стр.83] [стр.84] [стр.85] [стр.86] [стр.87] [стр.88] [стр.89] [стр.90] [стр.91] [стр.92] [стр.93] [стр.94] [стр.95] [стр.96] [стр.97] [стр.98] [стр.99] [стр.100] [стр.101] [стр.102] [стр.103] [стр.104] [стр.105] [стр.106] [стр.107] [стр.108] [стр.109] [стр.110] [стр.111] [стр.112] [стр.113] [стр.114] [стр.115] [стр.116] [стр.117] [стр.118] [стр.119] [стр.120] [стр.121] [стр.122] [стр.123] [стр.124] [стр.125] [стр.126] [стр.127] [стр.128] [стр.129] [стр.130] [стр.131] [стр.132] [стр.133] [стр.134] [стр.135] [стр.136] [стр.137] [стр.138] [стр.139] [стр.140] [стр.141] [стр.142] [стр.143] [стр.144] [стр.145] [стр.146] [стр.147] [стр.148] [стр.149] [стр.150] [стр.151] [стр.152] [стр.153] [стр.154] [стр.155] [стр.156] [стр.157] [стр.158] [стр.159] [стр.160] [стр.161] [стр.162] [стр.163] [стр.164] [стр.165] [стр.166] [стр.167] [стр.168] [стр.169] [стр.170] [стр.171] [стр.172] [стр.173] [стр.174] [стр.175] [стр.176] [стр.177] [стр.178] [стр.179] [стр.180] [стр.181] [стр.182] [стр.183] [стр.184] [стр.185] [стр.186] [стр.187] [стр.188] [стр.189] [стр.190] [стр.191] [стр.192] [стр.193] [стр.194] [стр.195] [стр.196]