Это задание странное, так как это не проблема, которую нужно решать с помощью рекурсии. Хотя, это будет странно, это выполнимо.
Для n = 2 вы хотите
F1: SD(2) = sqrt(((2-mean)^2 + (1-mean)^2)/(2-1))
это можно записать как:
F2: (2-1) * SD(2)^2 = (2-mean)^2 + (1-mean)^2
Для n = 3 Вы хотите
F3: SD(3) = sqrt(((3-mean)^2 + (2-mean)^2 + (1-mean)^2)/(3-1))
Теперь вставьте (2-mean)^2 + (1-mean)^2
из F2 выше, и вы получите:
F4: SD(3) = sqrt(((3-mean)^2 + (2-1) * SD(2)^2)/(3-1))
^^^^^
Here is the recursion
В более общем смысле формула будет:
SD(n) = sqrt(((n - mean)^2 + (n-1-1) * (SD(n-1))^2)/(n-1))
Таким образом, рекурсивный вызов будет выглядеть примерно так:
double foo(int n, double mean)
{
if (n == 2) return sqrt(pow(2-mean, 2) + pow(1-mean, 2));
return sqrt((pow(n-mean, 2) + (n-2)*pow(foo(n-1, mean), 2))/(n-1));
// ^^^
// recursive call
}
Не красиво, но выполнимо.
Итак, полная программа, которая имеет как рекурсивный метод, так и лучший l oop - Метод может быть:
#include <stdio.h>
#include <math.h>
// Recursive method
double foo(int n, double mean)
{
if (n == 2) return sqrt(pow(2-mean, 2) + pow(1-mean, 2));
return sqrt((pow(n-mean, 2) + (n-2)*pow(foo(n-1, mean), 2))/(n-1));
// ^^^
// recursive call
}
// Loop method
double bar(int n, double mean)
{
double x = 0;
for (int i = 1; i <=n; ++i)
{
x = x + pow(i-mean, 2);
}
x = x / (n - 1);
return sqrt(x);
}
int main() {
int n = 6;
double mean = (n + 1)/2.0;
printf("Recursive: %.20f\n", foo(n, mean));
printf("Loop: %.20f\n", bar(n, mean));
return 0;
}
Вывод:
Recursive: 1.87082869338697066475
Loop: 1.87082869338697066475