Рекурсивные функции
Функция, которая вызывает сама себя, называется рекурсивной функцией.
Рекурсия - вызов функции из самой функции.
Пример рекурсивной функции - функция вычисления факториала.
#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. Таким образом, если ответ не является целым числом, результаты могут отличаться. |
*