Рекурсивные функции

 

Функция, которая вызывает сама себя, называется рекурсивной функцией.

Рекурсия - вызов функции из самой функции.

Пример рекурсивной функции - функция вычисления факториала.

#define _CRT_SECURE_NO_WARNINGS // для возможности использования scanf #include <stdio.h> int fact(int num) // вычисление факториала числа num { if (num <= 1) return 1; // если число не больше 1, возвращаем 1 else return num*fact(num - 1); // рекурсивный вызов для числа на 1 меньше } // Главная функция int main() { int a, r; printf("a= "); scanf("%d", &a); r = fact(a); // вызов функции: num=a printf("%d! = %d", a, r); getchar(); getchar(); return 0; }  

 

Результат выполнения

Математические функции

Математические функции хранятся в стандартной библиотеке math.h. Аргументы большинства математических функций имеют тип double. Возвращаемое значение также имеет тип double.
Углы в тригонометрических функциях задаются в радианах.

Основные математические функции стандартной библиотеки.

 

Функция Описание
int abs(int x) Модуль целого числа x
double acos(double x) Арккосинус x
double asin(double x) Арксинус x
double atan(double x) Арктангенс x
double cos(double x) Косинус x
double cosh(double x) Косинус гиперболический x
double exp(double x) Экспонента x
double fabs(double x) Модуль вещественного числа
double fmod(double x, double y) Остаток от деления x/y
double log(double x) Натуральный логарифм x
double log10(double x) Десятичный логарифм x
double pow(double x, double y) x в степени y
double sin(double x) Синус x
double sinh(double x) Синус гиперболический x
double sqrt(double x) Квадратный корень x
double tan(double x) Тангенс x
double tanh(double x) Тангенс гиперболический x

 

/*08FACTR.C

Программа на С, использующая рекурсивные вызовы функции.

Вычисляет факториал числа.

Пример: 7! =7x6x5x4x3x2x1= 5040*/

 

#include "stdafx.h"

#include <iostream>

#include <conio.h>

#include <stdio.h>

#include <process.h>

#include <ctype.h>

#include <stdlib.h>

using namespace std;

 

double dfactorial(double danswer);

 

main()

{

double dnumber=15.0;

double dresult;

dresult=dfactorial(dnumber);

printf("The factorial of %.0lf is: %.0lf\n",dnumber,dresult);

 

printf ("\n\nPress any key to finish\n");

_getch();

return(0);

}

 

double dfactorial(double danswer)

{

if(danswer <= 1.0)

return(1.0);

else

return(danswer*dfactorial(danswer-1.0));

}

 

Возникает рекурсия, так как внутри функции dfactorial() имеется вызов ее самой.

В printf("%d", (int)sqrt(...)) приведении в целое число усекает цифры в целые числа, поэтому 2.9 становится 2 - и% d печатает это. Но в printf("%0.lf", sqrt(...)) число с плавающей запятой округляется до нуля десятичных цифр, поэтому 2.9 записывается как 3. Таким образом, если ответ не является целым числом, результаты могут отличаться.  

*