Задание 16

Пример 1

Алгоритм вычисления значения функции F(n), где n – натуральное число, задан следующими соотношениями:
F(n) = n при n < 3;
F(n) = 2×(n − 1) + F(n − 1) + 2, если n > 2 и при этом n четное;
F(n) = 2×(n + 1) + F(n − 2) − 5, если n > 2 и при этом n нечетно.
Чему равно значение выражения F(32)?

Пример 2

Алгоритм вычисления значения функции F(n), где n – натуральное число, задан следующими соотношениями:
F(n) = 1 при n = 1;
F(n) = n + F(n − 1), если n > 1.
Чему равно значение выражения F(2025) − F(1000)?

Пример 3

Алгоритм вычисления значения функции F(n), где n – натуральное число, задан следующими соотношениями:
F(n) = 1 при n < 3;
F(n) = F(n − 1) + F(n − 2), если n > 2 и при этом n нечетное;
F(n) = Сумма F(i), если n > 2 и при этом n четно.
Чему равно значение выражения F(24)?

Теория

Задача заключается в нахождении значения функции, или выражения, заданной рекуррентным соотношением. Если необходимо просто рассчитать значение функции F(n) при не очень большом значении n - то реализуем это соотношение с помощью функции и рекурсивно ее вызываем. Но проанализируйте исходное выражение - часто можно решить без программы - аналитически. Если возникает ошибка stack overflow, то используйте список.

Решение

Пример 1

Самый быстрый способ решения данной задачи - программа на языке Python. Используйте рекурсивный вызов функции. Ошибок не возникнет, т.к. 32 небольшое.

def F(n):
    if n < 3:
        return n
    else:
        if n % 2 == 0:
            return 2*(n-1)+F(n-1)+2
        else:
            return 2*(n+1)+F(n-2)-5
print(F(32))

Результат 530.

Пример 2

Программа на языке Python. Используйте рекурсивный вызов функции. При попытке выполнить рекурсию возникнет ОШИБКА (RecursionError: maximum recursion depth exceeded in comparison) - переполнение стека вызовов функций. См листинг ниже:

def F(n):
    if n == 1:
        return 1
    else:
        return n + F(n-1)
print(F(2025)-F(1000))

Используйте вспомогательный список (массив) - заполните его в цикле до 2025-го элемента согласно заданным соотношениям.

F = []
F.append(1)
F.append(1)
for i in range(2,2026):
    F.append(i+F[i-1])
print(F[2025]-F[1000])

Здесь первые два оператора F.append(1) помещают 1 в нулевой и первый элемент списка. Результат 1550825.

P.S. Алгоритм задан таким образом, что каждый элемент начиная с 2 - сумма всех предыдущих и самого элемента. Т.е. каждый элемент n - сумма арифметической прогрессии с шагом 1 от 1 до n. Для F(2025) = (1+2025)/2 * 2025 = 2051325, а F(1000) = (1+1000)/2 * 1000 = 500500. 2051325 - 500500 = 1550825 😀.

Пример 3

Самый быстрый способ решения данной задачи - программа на языке Python. Используйте рекурсивный вызов функции. Отличие от Примера 1 - внутри функции F для четных n используется суммирование с помощью цикла.

def F(n):
    if n < 3:
        return 1
    else:
        if n % 2 != 0:
            return F(n-1)+F(n-2)
        else:
            sum = 0
            for i in range(1,n):
                sum += F(i)
            return sum print(F(24))

Результат 887040.

Ответ

Пример 1:  530 (Время не более 5 минут)

Пример 2:  1550825 (Время не более 5 минут)

Пример 3:  887040 (Время не более 5 минут)

Яндекс.Метрика