Иллюстрированный самоучитель по Mathematica



              

Некоторые правила культурного программирования - часть 3


Отсюда ясно, что даже равноценные операции умножения и деления 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/с

Помимо указанных примеров выполнения трассировки и отладки возможны и иные их варианты, осуществляемые с помощью ряда функций. Эти функции представлены в приложении. Надо, однако, отметить, что применение этих функций на современном уровне программирования ограничено — в подобной трассировке особой необходимости нет, поскольку система выдачи диагностических сообщений позволяет выполнять отладку более удобными средствами.

 

Что нового мы узнали?

В этом уроке мы научились:

  • Работать с образцами.
  • Создавать функции.
  • Использовать функции FixedPoint и Catch.
  • Реализовывать рекурсивные и рекуррентные алгоритмы.
  • Использовать процедуры.
  • Создавать циклы различного типа.
  • Использовать условные выражения и безусловные переходы.
  • Работать с контекстами.
  • Готовить пакеты расширений системы Mathematica.
  • Создавать простейшие средства визуального программирования.
  • Использовать средства отладки и трассировки программ.



Содержание  Назад  Вперед