Рекурсия

Задача 5.

#include <iostream>
 
using namespace std;
 
unsigned int fibonachi(unsigned int n, unsigned int *foudned);
 
int main()
{
    int k, n;
 
    std::cout << "Input k: ";
    std::cin >> k;
    std::cout << std::endl;
 
    // Масив, в който ще се запомнят намерените числа
    unsigned int foudnedArray[5000] = {0};
 
    for( int i=1; i<=k; i++ ) {
        std::cout << "fibonachi(" << i << "): " << fibonachi(i, foudnedArray) << std::endl;;
    }
 
    return 0;
}
 
unsigned int fibonachi(unsigned int n, unsigned int *foudned)
{
    // Ако е 1-то или 2-то число на фибоначи (условие за край)
    if( n <= 2 ) return 1;
 
    // Ако числото вече е било намерено(условие за край)
    if( foudned[n] > 0 ) return foudned[n];
 
    // Променлива, в която се запомня търсеното число
    unsigned int fibonachiNum;
 
    // Прави се рекурсивно извикване, за да се намери числото
    fibonachiNum = fibonachi(n-1, foudned) + fibonachi(n-2, foudned);
 
    // Запомня намереното n-то число на съответната позиция в масива
    foudned[n] = fibonachiNum;
 
    return fibonachiNum;
}

Задача 6.

#include <iostream>
 
using namespace std;
 
unsigned int factoriel(unsigned int n);
 
int main()
{
    unsigned int a, b;
 
    do {
        std::cout << "Input a: ";
        std::cin >> a;
        std::cout << "Input b: ";
        std::cin >> b;
        std::cout << std::endl;
 
        if( b > a && a >= 0 ) break;
 
        std::cout << "Incorect values for a,b!" << std::endl;
 
    } while(true);
 
    unsigned long long int result;
 
    result = (factoriel(a) + factoriel(b) ) / (b - a);
 
    std::cout << "R = (" << a << "!+" << b << "!)/(" << b << " − " << a << ") = " << result << std::endl;;
 
    return 0;
}
 
unsigned int factoriel(unsigned int n)
{
    // Ако n е 1 или 0, то стойността е 1 (условие за край)
    if( n < 2 ) return 1;
 
    return n*factoriel(n-1);
}

Задача 7.

#include <iostream>
 
using namespace std;
 
double pow_rec(double a, int n);
 
int main()
{
    unsigned int a, b, c, k, p, r;
 
    std::cout << "Input a: ";
    std::cin >> a;
    std::cout << "Input b: ";
    std::cin >> b;
    std::cout << "Input c: ";
    std::cin >> c;
    std::cout << "Input k: ";
    std::cin >> k;
    std::cout << "Input p: ";
    std::cin >> p;
    std::cout << "Input r: ";
    std::cin >> r;
    std::cout << std::endl;
 
    // Променливи, в които ще се изчислят числителя и знаменателя
    double numerator, denumerator;
 
    numerator   = pow_rec(a+b, k);
    denumerator = pow_rec(a, p) - pow_rec(c, r);
 
    // Проверява се знаменателя да не е нула
    if( 0 == denumerator ) {
        std::cout << "Denominator (a^p − c^r) = (" << a << "^" << p << "-" << c << "^" << r << ") = 0 !"
                  << std::endl;
    }
    else {
        std::cout << "R = (a + b)^k / (a^p − c^r) = "
                  << "(" << a << "+" << b << ")^" << k // числителя
                  << " / "
                  << "(" << a << "^" << p << "-" << c << "^" << r << ")" // знаменателя
                  << " = " << numerator/denumerator << std::endl;
    }
 
    return 0;
}
 
/**
 * Намира степента на a ^ n
 *
 * @param double a
 * @param int n
 * @return double
 */
double pow_rec(double a, int n)
{
    if( n == 0 ) return 1.0;
    if( n < 0 ) return 1/pow_rec(a, -n);
 
    return (double)(a*pow_rec(a, n-1));
}

Задача 8.

#include <iostream>
 
using namespace std;
 
int nod_rec(int a, int b);
 
int main()
{
    unsigned int n;
 
    std::cout << "Input n: ";
    std::cin >> n;
    std::cout << std::endl;
 
    int nod;
    for (int i=0; i<n; i++) {
 
        int num;
        do {
            std::cout << "Input number " << i+1 << ": ";
            std::cin >> num;
 
            if( 0 != num ) break;
 
            std::cout << "Number can not be 0! " << std::endl;
        }
        while(true);
 
        if( num < 0 ) num = -num;
 
        if( 0 == i) {
            nod = num;
        }
        else {
            nod = nod_rec(nod, num);
        }
    }
 
    std::cout << "NOD = " << nod << std::endl;
 
    return 0;
}
 
/**
 * Намира НОД(a,b)
 *
 * @param int a
 * @param int b
 * @return int
 */
int nod_rec(int a, int b)
{
    if( a == b ) return a;
 
    if( a > b ) return nod_rec(b, a-b);
    else return nod_rec(a, b-a);
}

Задача 9.

#include <iostream>
 
using namespace std;
 
void inputNumbers(int *numbers, int &size);
 
bool binary_check(int number);
 
int main()
{
    int numbers[90], numbersCnt;
 
    // Въвежда числата
    inputNumbers(numbers, numbersCnt);
 
    for(int i=0; i<numbersCnt; i++){
        if( numbers[i] > 0 && binary_check(numbers[i]) ){
            std::cout << numbers[i] << " ";
        }
    }
 
    std::cout << std::endl;
 
    return 0;
}
 
/**
 * Въвежда масива с числата
 *
 * @param int[] numbers
 * @param int cnt
 * @return void
 */
void inputNumbers(int *numbers, int &cnt)
{
    std::cout << "Input numbers size: ";
    std::cin >> cnt;
    std::cout << std::endl;
 
    int i=0, *pNumbers;
    pNumbers = numbers;
    while(i<cnt) {
        std::cout << "numbers[" << i << "] = ";
        std::cin >> *pNumbers++;
        i++;
    }
    std::cout << std::endl;
}
 
/**
 * Намира НОД(a,b)
 *
 * @param int a
 * @param int b
 * @return int
 */
bool binary_check(int number)
{
    if( 0 == number ) return true;
 
    if( number%2 == 1 ) {
        return !binary_check(number/2);
    }
    return binary_check(number/2);
}

Задача 10.

#include <iostream>
#include <cmath>
 
using namespace std;
 
bool is_prime_rec(unsigned number, unsigned divisor);
 
int main()
{
    int intervalBegining, intervalEnd;
 
    std::cout << "Input begining number for interval:";
    std::cin >> intervalBegining;
    std::cout << "Input end number for interval:";
    std::cin >> intervalEnd;
    std::cout << std::endl;
 
    if( intervalBegining > intervalEnd ) {
        std::cout << "Error input:\nEnd of interval muss be  greater then the begining!\n";
    }
 
    while( intervalBegining <= intervalEnd ){
 
        if( intervalBegining >= 2 ) {
            unsigned divisor = sqrt(intervalBegining);
            if( is_prime_rec(intervalBegining, divisor) ) {
                std::cout << intervalBegining <<", ";
            }
        }
        intervalBegining++;
    }
    std::cout << std::endl;
 
    return 0;
}
 
 
/**
 * Намира дали дадено естествено число е просто
 *
 * @param unsigned number
 * @param unsigned divisor
 * @return bool
 */
bool is_prime_rec(unsigned number, unsigned divisor)
{
    // Проверка за коректност на данните
    if( number < 2 || divisor < 1 ) return false;
 
    // Ако делителят е станал 1-ца, без да е делил числото, то е просто
    if( 1 == divisor ) return true;
 
    // Ако текущият делител дели числото, то не е просто и връща false
    // В противен случай се връща стойността от същата функция, извикана
    // със стойност за делителя, намалена с единица
    if( number%divisor == 0 ) {
        return false;
    }
    else {
        return is_prime_rec(number, divisor-1);
    }
}

Задача 11.

#include <iostream>
 
using namespace std;
 
void inputNumbers(int *numbers, int &size);
 
double sum_even_indexes_rec(int *numbers, int size, int currentPos);
 
int main()
{
    int numbers[90], size;
 
    // Въвежда числата
    inputNumbers(numbers, size);
 
    // Ако размерността (брояt на елементите) на масива е по-малко от 2, то няма четни индекси
    if( size < 2 ) {
        std::cout << "Not found even indexes!" << std::endl;
        return 0;
    }
 
    // Рекурсивното извикване започва с индекс 2
    std::cout << "Sum even indexes: " << sum_even_indexes_rec(numbers, size, 2);
    std::cout << std::endl;
 
    return 0;
}
 
/**
 * Въвежда масива с числата
 *
 * @param int[] numbers
 * @param int size
 * @return void
 */
void inputNumbers(int *numbers, int &size)
{
    std::cout << "Input numbers size: ";
    std::cin >> size;
    std::cout << std::endl;
 
    int i=0, *pNumbers;
    pNumbers = numbers;
    while(i<size) {
        std::cout << "numbers[" << i << "] = ";
        std::cin >> *pNumbers++;
        i++;
    }
    std::cout << std::endl;
}
 
/**
 * Намира сумата на елементите на масива с четни индекси и я връща като резултат
 *
 * @param int numbers (указател към масива с числата)
 * @param int size  (размерността на масива)
 * @param int shift (задава отместването към съответния четен индекс)
 * @return double
 */
double sum_even_indexes_rec(int *numbers, int size, int shift)
{
    if( shift >= size ) return 0.0;
 
    return *(numbers+shift) + sum_even_indexes_rec(numbers, size, shift+2);
}