Произведение ряда рекурсивно

208
16 июня 2018, 14:10

Помогите пожалуйста разобраться с рекурсией. Изучаю эту тему сейчас на парах, и никак не могу допереть, как с ней работать. Нужно произведение ряда без циклов. Буду благодарен за объяснения.

// Lab7.cpp: определяет точку входа для консольного приложения.
//
#include "stdafx.h"
#include <iostream>
#include <locale>
using namespace std;
double factorial(double a)
{
    if (a < 0)
{
    return 0;
}
    if (a == 1)
{
    return 1;
}
else
{
    return a*factorial(a - 1);
}
}

double power(double a, double b)
{
if (b == 0)
{
    return 1;
}
    else
{
    return a*power(a, b - 1);
}
}

double sum(int k, int x)
{
double a = 1;
if (k = 1)
{
    a = ((power((1 - x), (k + 1))+1) / power((factorial(k - 1)) + 1, 2));
}
else
{
    a *= ((power((1 - x), (k + 1))+1) / power((factorial(k - 1)) + 1, 2));
    k--;
    sum(k, x);
}
cout << "Произведение ряда  = " << a << endl;
}
int main()
{
setlocale(LC_ALL, "RUS");
int x, n;
cout << "Введите x:" << endl;
cin >> x;
cout << "Введите положительный n:" << endl;
cin >> n;
sum(n, x);
return 0;
}
Answer 1

Ну свой ряд сами попробуйте сами разобрать.

А вот рекурсию я вам попробую объяснить на примере произвидения Валлиса:

Ну что же мы тут имеем?! Для каждого i посчитать значение выражения, а потом умножить его на текущий ответ. Т.е.

А теперь на что обратим внимание, а на то, что элементы каждого выражения связаны с предыдущим. Т.е. 8 больше 6 на 2, 6 больше 4 на 2, 4 больше 2 на 2, видна закономерность??? Собственно эти размышления нас и приводят к первой формуле.

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

double vallis(double ans, int i) {
    // давайте в этой переменной мы будем хранить числитель
    int numerator = (2*i) * (2*i);
    // а в этой знаменатель
    int denumerator = (2*i - 1)*(2*i + 1);
    ans *= (double)numerator/denumerator;
    // Итак в текущем моменте нам известно, новое значение ans, но вот, что если мы хотели получить более точное значение `pi`? То давайте повторим весь набор инструкций для нового ans, а так же для чуток большего i.
    // Тут и приходит к нам на помощи рекурсия
    return vallis(ans, i+1);
}

Только наша функция будет работать вечно, так давайте же остaновим её в определённый момент, т.е. поставим ограничитель по глубине входа в рекурсию : if (i > 20) return ans; :

double vallis(double ans, int i) {
    if (i > 20) 
        return ans;
    int numerator = (2*i) * (2*i);
    int denumerator = (2*i - 1)*(2*i + 1);
    ans *= (double)numerator/denumerator;
    return vallis(ans, i+1);
}

Работает это как-то так :

Answer 2
#include <iostream>
double customPow(double value, double power)
{
    if (power == 0) return 1;
    return value*customPow(value, power - 1);
}
double factorial(double value)
{
    if (value == 0) return 1;
    return value * factorial(value - 1);
}
double rowSum(double n, double k, double x)
{
    if (k > n) return 0;
    return (customPow(1 - x, k + 1) + 1) / customPow(factorial(k - 1) + 1, 2) + rowSum(n,k+1,x);
}
double rowMult(double n, double k, double x)
{
    if (k > n) return 1;
    return (customPow(1 - x, k + 1) + 1) / customPow(factorial(k - 1) + 1, 2) * rowMult(n, k + 1, x);
}
int main(int argc, char * argv[])
{
    setlocale(LC_ALL, "RUS");
    double x, n;
    std::cout << "Введите x:" << std::endl;
    std::cin >> x;
    std::cout << "Введите положительный n:" << std::endl;
    std::cin >> n;
    std::cout << "Cумма ряда = " << rowSum(n, 1, x) << std::endl;
    std::cout << "Произведение ряда = " << rowMult(n, 1, x) << std::endl;
    system("pause");
    return 0;
}
READ ALSO
SDL2 как загрузить картинку (на иконку окна и на курсор)?

SDL2 как загрузить картинку (на иконку окна и на курсор)?

Нужно загрузить картинку в SDL_Surface для установки её на иконку окна и на кастомный курсорНашел вот этот способ превращения массива пикселей...

226
Flexbox IE и Edge

Flexbox IE и Edge

Сверстан сайт на flexboxПроблема в том, что во всех браузерах меню нормально и адекватно отображается в одну строку, но в IE и Edge текст в меню съезжает...

200
Как переписать код под другой стиль

Как переписать код под другой стиль

Есть пример кода (библиотеки, котоирую я использую)

218
Javascript Canvas и CSS цвета

Javascript Canvas и CSS цвета

На сайте мне необходима функция цветовой пипетки, то есть возможность скопировать цвет пикселя, который находится под курсором

219