Эта проблема напрашивается для искаженных решений.
Вот та, которая использует одну функцию, принимающую один или два int
аргумента:
- , если первый аргумент положительный, он вычисляет выражение для этого значения
- , если первый аргумент отрицательный, за ним должен следовать второй аргумент и выполняется один шаг в вычислении, повторяющийся для предыдущего шага.
- , который он использует
<stdarg.h>
, который может или не может быть разрешен.
Вот код:
#include <math.h>
#include <stdarg.h>
double rec_sqrt_series(int n, ...) {
if (n < 0) {
va_arg ap;
va_start(ap, n);
int m = va_arg(ap, int);
va_end(ap);
if (m > -n) {
return 0.0;
} else {
return sqrt(m + rec_sqrt_series(n, m + 1));
}
} else {
return rec_sqrt_series(-n, 1);
}
}
Вот еще одно решение с одной функцией, использующее только <math.h>
, но злоупотребление правилами по-другому: использование макроса.
#include <math.h>
#define rec_sqrt_series(n) (rec_sqrt_series)(n, 1)
double (rec_sqrt_series)(int n, int m) {
if (m > n) {
return 0.0;
} else {
return sqrt(m + (rec_sqrt_series)(n, m + 1));
}
}
Еще один, строго говоря рекурсивный , но с одним уровнем рекурсии и без других уловок. Как прокомментировал Eri c, он использует for
l oop, который может быть недопустимым при ограничениях OP:
double rec_sqrt_series(int n) {
if (n > 0) {
return rec_sqrt_series(-n);
} else {
double x = 0.0;
for (int i = -n; i > 0; i--) {
x = sqrt(i + x);
}
return x;
}
}