Шаг 160.
Рекурсия на Python.
Выполнение программы. Программный стек. Трассировка стека

    На этом шаге мы рассмотрим средства, используемые для выполнения этой операции.

    Ещё одно полезное и важное для отладки понятие - трассировка стека (stack trace), или отчёт о состоянии программного стека на определённый момент выполнения программы. Большинство языков программирования обладает функционалом для отображения трассировки стека. Например, в языке Python трассировку стека можно выполнить с помощью модуля Traceback. Помимо этого, "трасса" стека печатается при выходе программы на ошибку времени выполнения.

    Давайте заменим операцию сложения в строке 6 из примера 10.1 ошибочным вычитанием s = s - u[i]*v[i] (прочие функции тоже будут ошибочными, поскольку и они вызывают dot_product()). Тогда, например, вычисление евклидовой нормы (длины) отличного от нуля вектора привело бы к ошибке времени выполнения программы, поскольку она попыталась бы извлечь квадратный корень из отрицательного числа. При выполнении такого кода стандартный интерпретатор языка Python выдал бы такое сообщение:

Traceback (most recent call last):
  File "D:/PythonProjects/Recursion/pr160_1.py", line 22, in <module>
    print(cosine(a, b))
  File "D:/PythonProjects/Recursion/pr160_1.py", line 16, in cosine
    return dot_product(u, v) / norm_Euclidean(u) / norm_Euclidean(v)
  File "D:/PythonProjects/Recursion/pr160_1.py", line 12, in norm_Euclidean
    return math.sqrt(dot_product(v, v))
ValueError: math domain error


Рис.1. Выдача сообщения об ошибке

    Оно говорит о том, что пакет math столкнулся с ошибкой (времени выполнения) в строке 12 при выполнении метода norm_Euclidean(), который был вызван в строке 16 функцией cosine(). В сообщении также указывается строка 22, в которой вызывается метод cosine() (в некоторых языках программирования в программный стек помещается стековый кадр основной программы main). В заключение отметим, что структура сообщения точно соответствует состоянию программного стека на шаге 5 из рисунка 1, 159 шага.

    На следующем шаге мы рассмотрим пространственную сложность вычислений.




Предыдущий шаг Содержание Следующий шаг