/* Подсчёт суммы ф-й. На входе n + i, а ф-я должна пробежать от 1 (j) до максимума (n) с учётом (i) в формуле.
n = сколько раз суммировать тело из sum1 * sum2 * sum3
i = фикс.параметр передаётся в ф-ю
j = итерация
*/
#include <iostream>
#include <cmath>
using namespace std;
//##############################################################################
// суммирование через рекурсию
int F(int n, int i)
{
if (i < n) {return i;} // по условию
int itogo = 0;
for (int j = 1; j <= n; j++)
{
/* debug:
int sum1 = pow(-1, (j +1)); // (ok) чётная степень = 1; нечет = -1. Т.е. нечётный j -> sum1 = 1, чётный j -> sum1 = -1.
int sum2 = sum1 * j; // (ok) n=3, i=3, j=3 = 3
int sum3 = F(n, i - j); // (ok) рекурсия
int sum_body = sum2 * sum3;
printf("sum1 = %d, sum2 = %d, sum3 = %d, sum_body = %d\tпри: n = %d, i = %d, j = %d\n\n", sum1, sum2, sum3, sum_body, n, i, j);
*/
itogo += pow(-1, (j +1)) * j * F(n, i - j);
}
return itogo;
}
//##############################################################################
int main(int argc, char *argv[])
{
system("clear");
if (argc != 3) {cout << "формат запуска: " << argv[0] << " int int (2 целых числа для: n И i)\n\n"; return 0;}
cout << F(atoi(argv[1]), atoi(argv[2])) << "\n";
return 0;
}
автор |
---|
Мемоизация - это запоминание однажды посчитанного, т.е. кэширование. |
в данном случае и так считает мгновенно, даже "./a.out 345873853 193845738"
да и такие простейшие расчёты имхо проще, чем запоминать каждую цифру, а потом ещё if делать на каждую