Помогите пожалуйста разобраться с рекурсией. Изучаю эту тему сейчас на парах, и никак не могу допереть, как с ней работать. Нужно произведение ряда без циклов. Буду благодарен за объяснения.
// 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;
}
Ну свой ряд сами попробуйте сами разобрать.
А вот рекурсию я вам попробую объяснить на примере произвидения Валлиса:
Ну что же мы тут имеем?! Для каждого 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);
}
Работает это как-то так :
#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;
}
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Нужно загрузить картинку в SDL_Surface для установки её на иконку окна и на кастомный курсорНашел вот этот способ превращения массива пикселей...
Сверстан сайт на flexboxПроблема в том, что во всех браузерах меню нормально и адекватно отображается в одну строку, но в IE и Edge текст в меню съезжает...
На сайте мне необходима функция цветовой пипетки, то есть возможность скопировать цвет пикселя, который находится под курсором