Трассировка программных модулей
Трассировка программных модулей
В практике подготовки и отладки программ важное значение имеет наличие специальных средств отладки программ по шагам — средств трассировки. Mathematica имеет ряд функций для осуществления трассировки своих программных конструкций. Функция Trace [ехрг] позволяет выполнить трассировку выражения ехрг. Возьмем простой пример — вычисление выражения 2 (3 + 4) 2 /5: Trace[2 (3 + 4)^2 / 5] {{{{3+4, 7 },7^2,49}, {1/5,1/5}, 49/5, 49/5}, 249/5, 98/5} Результат трассировки представлен вложенными списками, имеющими два элемента — вычисляемое выражение и результат вычислений. В частности, для приведенного примера отчетливо видно, что вначале вычисляется выражение в круглых скобках (3 + 4) и получается результат 7, который затем возводится в квадрат — получается число 49. Затем вызывается явно не записанная единица для деления на 5, потом 49 умножается на 1/5 и, наконец, 49/5 умножается на 2 и получается конечный результат. Отсюда ясно, что даже равноценные операции умножения и деления Mathematica разделяет по приоритету — деление выполняется перед умножением! Символьные операции также могут трассироваться: Trace[а*а/(b*b)] {{ {{bb,b^2}, 1/b^2, 1/b^2}, aa/b^2, a^2/b^2}
Можно выполнить и трассировку рекуррентных вычислений. Ниже представлен пример трассировки вычисления чисел Фибоначчи: fib[n_] := fib[n - 1] + fib[n - 2] fib[0] = fib[l] = 1 1 Trace[fib[5], fib[n_] -> n] {5, {4, {3, {2, {!}, {0}}, {!}}, {2, {1}, {0}}}, {3, {2, {!}, {0}}, {!}}} Trace[fib[3]] {fib[3], fib[3-l] + fib[3-2] , {{3- 1, 2}, fib[2] , fib[2-l] + fib[2- 2] , {{2-1, 1}, fibtl], 11, {{2-2, 0}, fib[0] , 1}, 1+1, 2}, {{3-2, 1}, fib[l], 1}, 2+1, 3} Функция TracePrint [expr] дает распечатку последовательности действий при вычислении выражения ехрг: TracePrint[a*b/c] ab/c Times а b _1 с Power 1/c ab/с