Вычислить значение выражения с помощью рекурсивной функции - C (СИ) (152962)
Формулировка задачи:
S=ln(1+a)
Решение задачи: «Вычислить значение выражения с помощью рекурсивной функции»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define EPS 0.0000001 // точность вычисления
//
// рекурсивная функция вычисления
double calc_ln( const double a, const double eps );
int main( void ) {
double a;
printf( "Введите a " );
scanf( "%lf", &a );
// проверяем входит ли в нужный нам диапазон число a
if ( a > 1 || a <= -1 ) { // если нет, то сообщаем пользователю
fprintf( stderr, "Число должно быть в диапазоне -1 < a <= 1\n" );
return EXIT_FAILURE; // выходим из программы
}
// иначе все в порядке - вычисляем значение и выводим на экран
printf( "Ln( 1 + %g ) = %.10f\n", a, calc_ln( a, EPS ) );
return EXIT_SUCCESS;
}
double calc_ln( const double a, const double eps ) {
// для текущего элемента ряда
static double curr = 1.0; // числитель
static int i = 1; // знаментатель
// вычисляем
curr *= a; // числитель
double curr_elem = curr / i++; // знаменатель
// проверяем достигнута ли необходимая точность
// если да, то прерываем рекурсию возвращая текущий элемент ряда
// иначе вычисляем следующий элемент ряда и суммируем его с текущим
return fabs( curr_elem ) <= eps ? curr_elem : curr_elem + calc_ln( a, eps ) * -1;
}
Объяснение кода листинга программы
- Включаются необходимые заголовочные файлы
- Определяется константа EPS, которая задает требуемую точность вычислений
- Объявляется рекурсивная функция calc_ln для вычисления натурального логарифма, принимающая два аргумента: a и eps
- В функции main запрашивается значение переменной a у пользователя с помощью функции scanf
- Проверяется, находится ли введенное значение a в диапазоне -1 < a <= 1. Если нет, то выводится сообщение об ошибке и программа завершается с кодом EXIT_FAILURE
- Если условие выполняется, то вызывается функция calc_ln с передачей в нее значения a и EPS
- Результат вычисления функции calc_ln выводится на экран с помощью функции printf
- В функции calc_ln инициализируются две переменные: числитель curr и знаменатель i. Начальное значение числителя равно 1.0, а знаменателя - 1
- В цикле рекурсивно вызывается функция calc_ln с передачей в нее значения a и EPS. При этом числитель curr умножается на значение a, а знаменатель i увеличивается на единицу
- Проверяется, достигнута ли необходимая точность вычислений. Если да, то рекурсия прерывается и возвращается текущий элемент ряда
- Если условие не выполняется, то вычисляется следующий элемент ряда и результат суммируется с текущим элементом ряда
- Функция calc_ln возвращает полученный результат