Модуль 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;
}
Если у вас не отображается решение последних задач, значит у вас включен блокировщик рекламы который вырезает эти ответы
АХХАХАХАХАХАХ Я **** Я СЮДА НАПИСАЛ ОТВЕТЫ С 1.8 МОДУЛЯ ААХАХХАХХАХАХАХ
13.
#include <iostream>
using namespace std;
int main()
{
int n, m;
cin >> n >> m;
int a[100][100] = {0};
int c = 1, k = 0, x_s = 1, y_s = 0, x = 0, y = 0;
for (int c = 1; c <= n*m; c++)
{
a[y][x] = c;
x += x_s;
y += y_s;
if (x < 0 || y<0 || x>m-1 || y>n-1 || a[y][x] != 0)
{
x -= x_s;
y -= y_s;
k++;
if (k == 4)
{
k = 0;
}
if (k == 0)
{
x_s = 1;
y_s = 0;
}
if (k == 1)
{
x_s = 0;
y_s = 1;
}
if (k == 2)
{
x_s = -1;
y_s = 0;
}
if (k == 3)
{
x_s = 0;
y_s = -1;
}
x += x_s;
y += y_s;
}
}
cout<<» «;
for(int i = 1; i <= n; i++){
for(int j = 1; j <= m; j++){
std::cout.width(4); std::cout << a[i-1][j-1];
}
cout<<endl;
}
return 0;
}
12.
#include <bits/stdc++.h>
using namespace std;
int main(){
int n, m;
cin >> n >> m;
int a[n][m], num = 1;
for(int i = 0; i < n; i++){
if(i % 2 == 0)
for(int j = 0; j < m; j++){
if(j % 2 == 0){
a[i][j] = num;
num++;
}
else
a[i][j] = 0;
}
else
for(int j = 0; j < m; j++){
if(j % 2 == 1){
a[i][j] = num;
num++;
}
else
a[i][j] = 0;
}
}
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++)
cout << setw(4) << a[i][j];
cout << endl;
}
return 0;
}
11.
#include <iostream>
#include <iomanip>
using namespace std;
int main() {
int n, m;
cin >> n >> m;
int arr[n][m];
int num = 1;
for (int diag = 0; diag < n + m — 1; diag++) {
for (int i = max(0, diag — m + 1); i <= min(diag, n — 1); i++) {
int j = diag — i;
arr[i][j] = num++;
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cout << setw(4) << arr[i][j];
}
cout << endl;
}
return 0;
}
10.
#include <iostream>
using namespace std;
#include <climits>
int main() {
int n, m , kdase=0;
cin >> n >> m;
int egorkrid[n][m];
for (int i = 0;i < n;i++){
for (int j = 0;j < m;j++){kdase++;
if (i % 2 == 0){egorkrid[i][j]=kdase;}else {egorkrid[i][m-j-1]=kdase;}}
}
for (int i = 0;i < n;i++){
for (int j = 0;j < m;j++){
if (egorkrid[i][j] > 0 and egorkrid[i][j] < 10){cout << » «;}
if (egorkrid[i][j] > 9 and egorkrid[i][j] < 100){cout << » «;}
if (egorkrid[i][j] > 99 and egorkrid[i][j] < 1000){cout << » «;}
cout << egorkrid[i][j];
}
cout << endl;
}
return 0;
}
//m = 4
//j 0 1 2 3
//m-j-1 3 2 1 0
9.
#include <bits/stdc++.h>
using namespace std;
int main() {
int n,m;
cin>>n>>m;
int a[n][m];
for (int i=0;i<n;i++){
for (int j=0;j<m;j++){
cin>>a[i][j];
}
}
for (int i=0;i<m;i++){
for (int j=n-1;j>=0;j—){
cout<<a[j][i]<<» «;
}
cout<<endl;
}
return 0;
}
8.
#include <iostream>
#include <cmath>
#include <cstdlib>
#include <vector>
using namespace std;
int MinDivisor(int n) {
int p = 2, k = n;
while (p * p <= n) {
if (n % p == 0) {
k = p;
break;
}
p = p + 1;
}
return k;
}
int main() {
int n;
cin >> n;
cout << MinDivisor(n);
return 0;
}
7.
#include <iostream>
double power(double a, int n) {
if (n == 0) {
return 1;
} else if (n > 0) {
return a * power(a, n — 1);
} else {
return 1 / (a * power(a, -n — 1));
}
}
int main() {
double a;
int n;
std::cin >> a >> n;
std::cout << power(a, n) << std::endl;
return 0;
}
5.
#include <iostream>
#include <cmath>
bool IsPointInCircle(double x, double y, double xc, double yc, double r) {
// Расстояние от точки (x, y) до центра круга (xc, yc)
double distance = std::sqrt(std::pow(x — xc, 2) + std::pow(y — yc, 2));
// Возвращаем результат сравнения расстояния с радиусом
return distance <= r;
}
int main() {
double x, y, xc, yc, r;
std::cin >> x >> y >> xc >> yc >> r;
if (IsPointInCircle(x, y, xc, yc, r)) {
std::cout << «YES» << std::endl;
} else {
std::cout << «NO» << std::endl;
}
return 0;
}
1.
#include <bits/stdc++.h>
using namespace std;
int main() {
int a, b, c, d;
cin >> a >> b >> c >> d;
cout << min(min(a, b), min(c, d));
return 0;
}
задание 3
Функция IsPointInSquare не должна содержать инструкцию if.
в приведенном решение функция содержит if, что является не верным решением
#include <iostream>
using namespace std;
bool isPointInSquare(double x, double y){
return x*x<=1 && y*y<=1;
}
int main() {
double x,y;
cin >> x >> y;
isPointInSquare(x,y)?cout << «YES» :cout << «NO»;
return 0;
}
#include <iostream>
int fib(int n) {
if (n <= 2) {
return 1;
}
return fib(n — 1) + fib(n — 2);
}
int main() {
int n;
std::cin >> n;
std::cout << fib(n) << std::endl;
return 0;
}