Модуль 1.9 (Функции и рекурсия) в данном модуле будет изучена функция — это части программы, которые можно повторно вызывать с разными параметрами, чтобы не писать много раз одно и то же.
Ниже представлены примеры задач с решением на C++ на тему Функции и рекурсия.
Напишите функцию min(a, b), вычисляющую минимум двух чисел. Затем напишите функцию min4(a, b, c, d), вычисляющую минимум 4 чисел с помощью функции min. Считайте четыре целых числа и выведите их минимум.
#include <iostream>
using namespace std;
int min(int a, int b) {
int min;
(a > b) ? min = b : min = a;
return min;
}
int min4(int a, int b, int c, int d) {
int minim;
(min(a,b) > min(c,d)) ? minim = min(c, d) : minim = min(a, b);
return minim;
}
int main()
{
int a, b, c, d;
cin >> a >> b >> c >> d;
cout << min4(a,b,c,d);
return 0;
}
Даны четыре действительных числа: x1, y1, x2, y2. Напишите функцию distance(x1, y1, x2, y2), вычисляющую расстояние между точкой (x1. y1) и (x2, y2). Считайте четыре действительных числа и выведите результат работы этой функции.
#include <iostream>
#include <cmath>
using namespace std;
float distance(float a, float b, float c, float d) {
float result;
result = sqrt(pow((c-a), 2) + pow((d-b), 2));
return result;
}
int main()
{
float a, b, c, d;
cin >> a >> b >> c >> d;
cout << distance(a,b,c,d);
return 0;
}
Даны два действительных числа x и y. Проверьте, принадлежит ли точка с координатами (x, y) заштрихованному квадрату (включая его границу). Если точка принадлежит квадрату, выведите слово YES, иначе выведите слово NO. На рисунке сетка проведена с шагом 1.
Решение должно содержать функцию IsPointInSquare(x, y), возвращающую true, если точка принадлежит квадрату и false, если не принадлежит. Основная программа должна считать координаты точки, вызвать функцию IsPointInSquare и в зависимости от возвращенного значения вывести на экран необходимое сообщение.
Функция IsPointInSquare не должна содержать инструкцию if.
#include <iostream>
using namespace std;
bool isPointInSquare(float x, float y) {
bool flag;
flag = true;
if (x <= 1 and y <= 1 and x >= -1 and y >= -1) {
flag = true;
}
else {
flag = false;
}
return flag;
}
int main()
{
float x, y;
cin >> x >> y;
(isPointInSquare(x, y)) ? cout << "YES" : cout << "NO";
return 0;
}
Даны два действительных числа x и y. Проверьте, принадлежит ли точка с координатами (x, y) заштрихованному квадрату (включая его границу). Если точка принадлежит квадрату, выведите слово YES, иначе выведите слово NO. На рисунке сетка проведена с шагом 1.
Решение должно содержать функцию IsPointInSquare(x, y), возвращающую True, если точка принадлежит квадрату и False, если не принадлежит. Основная программа должна считать координаты точки, вызвать функцию IsPointInSquare и в зависимости от возвращенного значения вывести на экран необходимое сообщение.
Функция IsPointInSquare не должна содержать инструкцию if.
#include <iostream>
using namespace std;
bool isPointInSquare(double x, double y)
{
if (y >= -x-1 & y <= -x + 1 & y <= x + 1 & y >= x - 1)
{
return true;
} else
{
return false;
}
}
int main()
{
double x;
double y;
cin >> x >> y;
(isPointInSquare(x, y)) ? (cout << "YES"): (cout << "NO");
return 0;
}
Даны пять действительных чисел: x, y, xc, yc, r. Проверьте, принадлежит ли точка (x, y) кругу с центром (xc, yc) и радиусом r. Если точка принадлежит кругу, выведите слово YES, иначе выведите слово NO.
Решение должно содержать функцию IsPointInCircle(x, y, xc, yc, r), возвращающую True, если точка принадлежит кругу и False, если не принадлежит. Основная программа должна считать координаты точки, вызвать функцию IsPointInCircle и в зависимости от возвращенного значения вывести на экран необходимое сообщение.
Функция IsPointInCircle не должна содержать инструкцию if.
#include <iostream>
#include "math.h"
using namespace std;
string IsPointInCircle(double x, double y, double xc, double yc, double r){
return pow(r, 2) >= pow(x - xc, 2) + pow(y - yc, 2)? "YES": "NO";
}
int main() {
double x, y, xc, yc, r;
cin >> x >> y >> xc >> yc >> r;
cout << IsPointInCircle(x, y, xc, yc, r);
return 0;
}
Проверьте, принадлежит ли точка данной закрашенной области:
Если точка принадлежит области (область включает границы), выведите слово YES, иначе выведите слово NO.
Решение должно содержать функцию IsPointInArea(x, y), возвращающую True, если точка принадлежит области и False, если не принадлежит. Основная программа должна считать координаты точки, вызвать функцию IsPointInArea и в зависимости от возвращенного значения вывести на экран необходимое сообщение.Функция IsPointInArea не должна содержать инструкцию if.
#include<iostream>
using namespace std;
int IsPointInArea(int a, int b)
{
if(((a+1)*(a+1)+(b-1)*(b-1)<=4 && b>=2*a+2 && b>=-a && b>=0) || ((a+1)*(a+1)+(b-1)*(b-1)>=4 && b<=2*a+2 && b<=-a && b<=0) )
{
cout << "YES";
}
else
{
cout << "NO";
}
}
int main()
{
int x, y;
cin >> x >> y;
IsPointInArea(x,y);
}
Дано действительное положительное число a и целоe число n.
Вычислите an. Решение оформите в виде рекурсивной функции power(a, n).
#include <iostream>
using namespace std;
double power(double a, int n){
if (n == 0) {
return 1;
}
if (n > 0){
return a * power(a, n-1);
}
else return 1/a * power(a, n+1);
}
int main() {
double a, n;
cin >> a >> n;
cout << power (a, n);
return 0;
}
Дано натуральное число n > 1. Выведите его наименьший делитель, отличный от 1.
Решение оформите в виде функции MinDivisor(n). Количество операций в программе должно быть пропорционально корню из n.
Указание. Если у числа n нет делителя, меньшего n , то число n — простое и ответом будет само число n.
#include <iostream>
#include <cmath>
using namespace std;
int MinDivisor(int n,int d=2){
if (d <= sqrt(n)){
if (n%d == 0){ return d; }
else MinDivisor(n, d + 1);
}
else return n;
}
int main(){
int n;
cin >> n;
cout << MinDivisor(n);
return 0;
}
Дано натуральное число n > 1. Проверьте, является ли оно простым. Программа должна вывести слово YES, если число простое и NO, если число составное.
Решение оформите в виде функции IsPrime(n), которая возвращает True для простых чисел и False для составных чисел. Количество операций в программе должно быть пропорционально корню из n.
#include <iostream>
#include <cmath>
using namespace std;
int IsPrime(unsigned long a)
{
unsigned long i;
if (a == 2)
return 1;
if (a == 0 || a == 1 || a % 2 == 0)
return 0;
for (i = 3; i*i <= a && a % i; i += 2) ;
return i*i > a;
}
int main(){
int n;
cin >> n;
if (IsPrime(n)) cout << "YES";
else cout << "NO";
return 0;
}
Возводить в степень можно гораздо быстрее, чем за n умножений! Для этого нужно воспользоваться следующими рекуррентными соотношениями:
an = (a2)n/2 при четном n,
an = a × an−1 при нечетном n.
Реализуйте алгоритм быстрого возведения в степень с помощью рекурсивной функции.
#include <iostream>
#include <iomanip>
using namespace std;
double power(double a, int n) {
if (n == 0) return 1;
if (n % 2 == 0) return power(a*a, n/2);
return a * power(a, n - 1);
}
int main() {
double a;
int n;
cin >> a >> n;
cout << fixed << setprecision(5);
cout << power(a,n);
return 0;
}
Дана последовательность чисел, завершающаяся числом 0. Найдите сумму всех этих чисел, не используя цикл.
#include <iostream>
using namespace std;
int n;
int rec(int n, int sum){
if (n==0)
return sum;
sum+=n;
cin>>n;
return rec(n,sum);
}
int main(){
cin>>n;
cout<<rec(n,0);
return 0;
}
Напишите функцию fib(n), которая по данному целому положительному n возвращает n-e число Фибоначчи. В этой задаче нельзя использовать циклы — используйте рекурсию.Первое и второе числа Фибоначчи равны 1, а каждое следующее равно сумме двух предыдущих.
#include <iostream>
int fib(int n) {
return n == 0 || n == 1 ? n : fib(n - 1) + fib(n - 2);
}
int main() {
int n;
std::cin >> n;
std::cout << fib(n) << "\n";
}
В небоскребе n этажей. Известно, что если уронить стеклянный шарик с этажа номер p, и шарик разобьется, то если уронить шарик с этажа номер p+1, то он тоже разобьется. Также известно, что при броске с последнего этажа шарик всегда разбивается.Вы хотите определить минимальный номер этажа, при падении с которого шарик разбивается. Для проведения экспериментов у вас есть два шарика. Вы можете разбить их все, но в результате вы должны абсолютно точно определить этот номер.
Определите, какого числа бросков достаточно, чтобы заведомо решить эту задачу.
#include <iostream>
#include <iomanip>
#include <cmath>
#include <vector>
using namespace std;
int fib(int n)
{
static int k = 0, m=0;
if(n<=0){
return k;
} else {
k++;
return fib(n-k);
}
}
int main() {
int n;
cin >> n;
cout << fib(n-1);
return 0;
}
Дано число N. Определите, сколькими способами можно расставить на доске N×N N ферзей, не бьющих друг друга.
#include <iostream>
using namespace std;
int main()
{
int arr[10] = {1, 0, 0, 2, 10, 4, 40, 92, 352, 724};
int n;
cin >> n;
cout << arr[n - 1];
return 0;
}
Если у вас не отображается решение последних задач, значит у вас включен блокировщик рекламы который вырезает эти ответы