Практика 6

Задания в классе

Тема занятия - итеративные рекурсивные функции.

В прошлый раз мы строили линейную древовидную рекурсию. В этой практике мы изучим метод оптимизации рекурсии, который уменьшает объем информации, требуемый для запоминания отложенных вычислений.

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

Не смотря на то, что мы будем работать с Итерациями, но во всех заданиях запрещено использовать цикл for и while.

Факториал

В прошлый раз мы рассматривали обычное рекурсивное определение факториала:

Очевидно, что его можно переписать в итеративной форме:

Из определения мы можем заметить что:

произведение = счетчик * произведение
счетчик = счетчик + 1

Тогда

def factorial(n):
    return fact_iter(1, 1, n)

def fact_iter(product, counter, max_count):
    if counter > max_count:
        return product
    return fact_iter(counter * product, counter + 1, max_count)

Нарисуйте на доске процесс вычисления факториала. В этот раз у нас получился линейно итеративный процесс.

Фибоначчи

Математическое рекурсивное определение при переносе в программу даёт очень неэффективный алгоритм.

Идея: будем использовать две переменные a и b, которые в начале процесса зафиксируем значениями и . Тогда на каждом шаге применяем одновременную трансформацию:

a <- a + b
b <- a

Напишите линейно итеративный алгоритм для вычисления n-го числа ряда Фибоначчи.

Возведение в степень

Для закрепления изученного напишите функцию возведения числа в степень следующими способам:

  1. Линейнорекурсивным методом
  2. Линейноитеративным методом

Разрешено использовать только умножение, вычитание, сложение и рекурсию.

Домашнее задание

Циклы for и while использовать запрещено.

Быстрое возведение в степень

Существует более быстрый алгоритм возведения числа в степень, основывающийся на следующем наблюдении:

А также примите во внимание факт, что

Реализуйте быстрое возведение в степень линейно Рекурсивным и Итеративным методом.

Разрешено использовать только умножение, вычитание, сложение и рекурсию.

Вычисление квадратного корня числа

Использовать метод Ньютона.

Hints

Для решения задачи можно прочитать главу 1.1.7 (стр 40) из книги “Структура и интерпретация компьютерных программ”. Там используется в примерах язык Lisp, но это не должно пугать.

Напишите сами необходимый набор юнит тестов.