Глава 4. Использование функций при программировании на C++
Рис. 4.8: Алгоритм метода Ньютона
}
while ( f a b s ( a
−b )>=ep s ) ;
return k ;
}
//Функция, реализующая метод хорд.
i n t Chord ( double a , double b , double ∗ c , double e p s )
{ i n t k=0;
do
{
∗ c=a−f ( a ) / ( f ( b )−f ( a ) ) ∗ ( b−a ) ;
i f ( f ( ∗ c ) ∗ f ( a ) >0) a=∗c ;
e l s e b=∗c ;
k++;
}
while ( f a b s ( f ( ∗ c ) )>=e p s ) ;
return k ;
}
double f 1 ( double x )
//Первая производная функции f (x).
{
Программирование на языке С++ в среде Qt Creator
4.4. Решение задач с использованием функций
119
Рис. 4.9: Алгоритм метода простой итерации
return ( 2 ∗ x+5∗ s i n ( 5 ∗ x ) ) ;
}
double f 2 ( double x )
//Вторая производная функции f (x).
{
return (2+25∗ c o s ( 5 ∗ x ) ) ;
}
//Функция, реализующая метод касательных.
i n t Tangent ( double a , double b , double ∗ c , double e p s )
{ i n t k=0;
i f ( f ( a ) ∗ f 2 ( a ) >0) ∗ c=a ;
e l s e ∗ c=b ;
do
{
∗ c=∗c−f ( ∗ c ) / f 1 ( ∗ c ) ;
k++;
}
while ( f a b s ( f ( ∗ c ) )>=e p s ) ;
return k ;
}
© 2015 Алексеев Е. Р., Злобин Г. Г., Костюк Д. А., Чеснокова О. В., Чмыхало А. С.
120
Глава 4. Использование функций при программировании на C++
double f i ( double x , double L) //Функция, заданная выражением 4.4 .
{
return ( x+L∗ f ( x ) ) ;
}
//Функция, реализующая метод простой итерации.
i n t I t e r a t i o n ( double ∗x , double L , double e p s )
{ i n t k=0; double x0 ;
do
{
x0=∗x ;
∗x= f i ( x0 , L ) ;
k++;
}
while ( f a b s ( x0
−∗x )>=ep s ) ;
return k ;
}
i n t main ( )
{
double A, B, X, P ;
double ep = 0 . 0 0 1 ;
//Точность вычислений.
i n t K;
cout<<" a = " ; c i n >>A;
//Интервал изоляции корня.
cout<<" b = " ; c i n >>B ;
cout<<"Решение уравнения x ^2 - c o s ( 5 * x ) = 0 . "<cout<<"Метод дихотомии:"<K=Dichotomy (A, B,&X, ep ) ;
cout<<"Найденное решение x = "<cout<<" , количество итераций k = "<cout<<"Метод хорд:"<K=Chord (A, B,&X, ep ) ;
cout<<" Найденное решение x = "<cout<<" , количество итераций k = "<cout<<"Метод касательных: "<K=Tangent (A, B,&X, ep ) ;
cout<<" Найденное решение x = "<cout<<" , количество итераций k = "<cout<<"Метод простой итерации: "<X=A;
cout<<" L = " ; c i n >>P ;
K=I t e r a t i o n (&X, P , ep ) ;
cout<<" Найденное решение x = "<cout<<" , количество итераций k = "<return 0 ;
}
Результаты работы программы:
a=0.2
b=0.4
Решение уравнения x^2-cos(5*x)=0.
Метод дихотомии:
Найденное решение x=0.296094, количество итераций k=8
Метод хорд:
Найденное решение x=0.296546, количество итераций k=2
Метод касательных:
Найденное решение x=0.296556, количество итераций k=2
Метод простой итерации:
L=-0.2
Найденное решение x=0.296595, количество итераций k=3
Программирование на языке С++ в среде Qt Creator
4.5. Рекурсивные функции
121
4.5
Рекурсивные функции
Под рекурсией в программировании понимают функцию, которая вызывает
сама себя. Рекурсивные функции чаще всего используют для компактной реа-
лизации рекурсивных алгоритмов. Классическими рекурсивными алгоритмами
могут быть возведение числа в целую положительную степень, вычисление фак-
ториала. С другой стороны, любой рекурсивный алгоритм можно реализовать
без применения рекурсий. Достоинством рекурсии является компактная запись,
а недостатком — расход памяти на повторные вызовы функций и передачу па-
раметров, существует опасность переполнения памяти.
Рассмотрим применение рекурсии на примерах [7, 8].
Задача 4.8.
Вычислить факториал числа n.
Вычисление факториала подробно рассмотрено в задаче 3.12 (рис. 3.25). Для
решения этой задачи с применением рекурсии создадим функцию factoial, ал-
горитм которой представлен на рис. 4.10.
Рис. 4.10: Рекурсивный алгоритм вычисления факториала
Текст программы с применением рекурсии:
#include
using namespace s t d ;
long i n t f a c t o r i a l ( i n t n )
{
i f ( n<=1)
return n ;
e l s e
return n∗ f a c t o r i a l ( n
−1) ;
}
i n t main ( )
{
i n t i ; long i n t f ;
cout<<" i = " ; c i n >>i ;
f= f a c t o r i a l ( i ) ;
cout<return 0 ;
}
© 2015 Алексеев Е. Р., Злобин Г. Г., Костюк Д. А., Чеснокова О. В., Чмыхало А. С.
122
Do'stlaringiz bilan baham: |