{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Рекурсия" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Recur2.** Описать рекурсивную функцию `fact2(n)` вещественного типа, вычисляющую значение двойного факториала\n", "\n", "N!! = N·(N−2)·(N−4)·…\n", "\n", "(N > 0 — параметр целого типа; последний сомножитель в произведении равен 2, если N — четное число, и 1, если N — нечетное). С помощью этой функции вычислить двойные факториалы пяти данных чисел." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#описание функции\n", "def fact2(n):\n", " ..." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#основная программа\n", "..." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#тестирование функции\n", "assert fact2(1)==1, \"Test 1\"\n", "assert fact2(5)==15, \"Test 2\"\n", "assert fact2(6)==48, \"Test 3\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Recur3.** Описать рекурсивную функцию `power_n(x, n)` вещественного типа, находящую значение n-й степени числа x по формулам:\n", "\n", "$x^0 = 1,$\n", "\n", "$x^n = (x^{n/2})^2$ при четных $n > 0,$\n", "\n", "$x^n = x*x^{n-1}$ при нечетных $n > 0,$\n", "\n", "$x^n = 1/x^{-n}$ при $n < 0$\n", "\n", "(x ≠ 0 — вещественное число, n — целое; в формуле для четных n должна использоваться операция целочисленного деления). С помощью этой функции найти значения $x^n$ для данного x при пяти данных значениях n." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#описание функции\n", "def power_n(x, n):\n", " ..." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#основная программа\n", "..." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#тестирование функции\n", "assert power_n(2, 5)==32.0, \"Test 1\"\n", "assert power_n(2, -2)==0.25, \"Test 2\"\n", "assert power_n(3, 2)==9.0, \"Test 3\"\n", "assert power_n(0.5, -2)==4.0, \"Test 4\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Recur4.** Описать рекурсивную функцию `fib1(N)` целого типа, вычисляющую N-й элемент последовательности чисел Фибоначчи (N — целое число):\n", "\n", "$F_1 = F_2 = 1, F_K = F_{K−2} + F_{K−1}, K = 3, 4, … .$\n", "\n", "С помощью этой функции найти пять чисел Фибоначчи с данными номерами, и вывести эти числа вместе с количеством рекурсивных вызовов функции fib1, потребовавшихся для их нахождения." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#описание функции\n", "def fib1(N):\n", " ..." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#основная программа\n", "..." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#тестирование функции\n", "assert fib1(2)==1, \"Test 1\"\n", "assert fib1(6)==8, \"Test 2\"\n", "#количество рекурсивных вызовов необходимо искать с помощью глобальной переменной. \n", "#Тестовые значения необходимо определить самостоятельно, \"пройдя\" рекурсивный алгоритм для n=4,5,6" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Recur8.** Описать рекурсивную функцию `root_k(x, k, n)` вещественного типа, находящую приближенное значение корня k-й степени из числа x по формуле:\n", "\n", "$y_0 = 1, y_{n+1} = y_n − (y_n − x/(y_n)^{k−1})/k,$\n", "\n", "где $y_n$ обозначает root_k(x, k, n) при фиксированных $x$ и $k$. Параметры функции: $x$ (> 0) — вещественное число, $k$ (>1) и $n$ (>0) — целые. С помощью функции root_k найти для данного числа $x$ приближенные значения его корня $k$-й степени при шести данных значениях $n$." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#описание функции\n", "def root_k(x, k, n):\n", " ..." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#основная программа\n", "..." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#тестирование функции\n", "assert root_k(0.5, 2, 2)-0.708333333<1e-9, \"Test 1\"\n", "assert root_k(0.5, 2, 4)-0.70710678<1e-8, \"Test 2\"\n", "assert root_k(9, 2, 3)-3.02352941<1e-8, \"Test 3\"\n", "assert root_k(9, 2, 6)-3.0<1e-10, \"Test 4\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Recur9.** Описать рекурсивную функцию `gcd(a, b)` целого типа, находящую наибольший общий делитель (НОД, greatest common divisor) двух целых положительных чисел a и b, используя алгоритм Евклида:\n", "\n", "НОД(A, B) = НОД(B, A mod B), B ≠ 0; НОД(A, 0) = A,\n", "\n", "где «mod» обозначает операцию взятия остатка от деления. С помощью этой функции найти НОД(A, B), НОД(A, C), НОД(A, D), если даны числа A, B, C, D." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#описание функции\n", "def gcd(a,b):\n", " ..." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#основная программа\n", "..." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#тестирование функции\n", "assert gcd(15,5)==5,\"Test 1\"\n", "assert gcd(24,18)==6,\"Test 2\"\n", "assert gcd(15,13)==1,\"Test 3\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Recur10.** Описать рекурсивную функцию `digit_sum(k)` целого типа, которая находит сумму цифр целого числа k, не используя оператор цикла. С помощью этой функции найти суммы цифр для пяти данных целых чисел." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#описание функции\n", "def digit_sum(k):\n", " ..." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#основная программа\n", "..." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#тестирование функции\n", "assert digit_sum(5)==5,\"Test 1\"\n", "assert digit_sum(125)==8,\"Test 2\"\n", "assert digit_sum(10001)==2,\"Test 3\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Последняя задача.**\n", "Вычислить количество единиц в двоичной записи целого неотрицательного числа. С помощью этой функции найти количество единиц для пяти данных целых чисел." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#описание функции\n", "def count_entities(k):\n", " ..." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#основная программа\n", "..." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#тестирование функции\n", "assert count_entities(5)==2,\"Test 1\"\n", "assert count_entities(0)==0,\"Test 2\"\n", "assert count_entities(8)==1,\"Test 3\"" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.8" } }, "nbformat": 4, "nbformat_minor": 2 }