1

Тема: Рекурсія

Завдання: Компанія хоче передавати дані по телефону, але вона занепокоєна можливістю телефонного перехвату.
    Всі дані, що передаються, є чотирьохзначними цілими числами.
    Компанія попросила Вас написати програму, яка повинна шифрувати ці дані так, щоб вони могли передаватись з більшою безпекою.
    Ваша програма повинна читати цілі чотирьохзначні числа і шифрувати їх наступним чином:
    заміняти кожну цифру значенням остачі від ділення: (сума: ця цифра + 7) % 10,
    міняти місцями першу цифру з третьою і другу з четвертою, надрукувати зашифроване ціле.
    Напишіть функції шифрування і дешифрування інформації.



Як це можна зробити?

2

Re: Рекурсія

Не дуже бачу тут рекурсії, ну але можна і з нею,
Пишете приблизно наступне, псевдокод
У функції має бути змінна, що передається в неї, що буде зберігати позицію читання
Читаєм дані кратно 4 цифрам, можна в чотири змінні (не супер оптимально, але не так важливо для навчання) масиву
потім в циклі від  одного до чотирьох (або нуля до трьох) проводимо маніпуляції з елементами масиву, а конкретно
"остачі від ділення: (сума: ця цифра + 7) % 10,"
Далі робим заміну першу на третю, другу на четверту, можна в циклі від одного до двох (або від нуля до одного)
далі пхаєм то у вивід,
(тут починається рекурсія )
викликаєм себе (цю ж функцію) але флаг читання збільшуємо на 4


функцію дешифрування зворотнім чином дії, а так все те саме.

Подякували: xrustuna1121

3

Re: Рекурсія

Але мені здається, що зворотня дія для розшифровки не підійде якщо цифра в межах від 0 до 3
Для них треба робити винятки у вигляді if?

4

Re: Рекурсія

(d-7)%10 - зворотна дія до (d+7)%10.
Якщо сумніваєтеся, що буде з від'ємним d-7, робіть (d+10-7)%10=(d+3)%10, це та сама операція.

Подякували: xrustuna1121

5

Re: Рекурсія

А який можна написати код, використовуючи рекурсію, щоб визначити чи є введене число з клавіатури простим?

6 Востаннє редагувалося ch0r_t (08.11.2020 21:41:02)

Re: Рекурсія

#include <iostream>
using namespace std;

int recursivePrimeCheck(){
    int n;
    cout << "Number: ";
    cin >> n;
    if (n % 2 == 0 || n % 3 == 0){return recursivePrimeCheck();}
    for (int i = 5; i * i <= n; i = i + 6){
        if (n % i == 0 || n % (i + 2) == 0){
            return recursivePrimeCheck();
        }
    }
    return 0;
}

int main(){recursivePrimeCheck(); }

Якось так?

Подякували: xrustuna1121

7 Востаннє редагувалося ch0r_t (08.11.2020 21:38:41)

Re: Рекурсія

*Але краще додати ще перевірку на 0, 1, 2 і 3. На початку. Після "cin".

if (n <= 1){return recursivePrimeCheck();}
if (n <= 3){return 0;} 

Якщо не секрет, - звідки такі завдання у вас? Підручник чи видано Викладачем?

Подякували: xrustuna1121

8 Востаннє редагувалося koala (08.11.2020 21:51:58)

Re: Рекурсія

Рекурсія є, взагалі кажучи, певним чином тотожною циклу. Тобто якщо за допомогою циклу щось можна зробити - то можна і за допомогою рекурсії.
Можна навіть без розгалужень, якщо вам цікаво.

Подякували: xrustuna112, ch0r_t, leofun013

9 Востаннє редагувалося koala (08.11.2020 21:52:10)

Re: Рекурсія

Пане tchort, ви визначаєте за допомогою циклу, а не за допомогою рекурсії. І вводите ви без допомоги рекурсії. За допомогою рекурсії ви не випускаєте користувача з програми, поки він не введе просте число, чого в умові не було.

Подякували: xrustuna112, ch0r_t2

10

Re: Рекурсія

На жаль не розібралась я як тут відповідати комусь конкретно((
Завдання дає викладачка, а оскільки в школі як такої інформатики в нас не було, то дуже важко поки що все сприймати і розв'язувати щось подібне.
Якраз вся суть у тому що не вмію написати рекурсією те, що можу написати циклом

11 Востаннє редагувалося ch0r_t (09.11.2020 00:21:58)

Re: Рекурсія

koala - ваша правда, поверхневе розуміння задачі і швидко зліплений код. Моя помилка.
Ваше рішення доволі цікаве.
Моє нашвидкоруч. Вправи з рекурсіями, маю сказати, можуть бути доволі корисні.

#include <iostream>
using namespace std;

int rPrimeCheck(int n=0){
    cout << "-1 to exit. \n" << "Number: ";
    int j=5;
    cin >> n; if( n == -1){return 0;}
    if (n <= 1){return rPrimeCheck();}
    if (n <= 3){return 0;} 
    if (n % 2 == 0 || n % 3 == 0){return rPrimeCheck();}
    if (j*j <= n){
        if (n % j == 0 || n % (j + 2) == 0){
            return rPrimeCheck();
            }
    }
    return 0;
}

int main(){rPrimeCheck(); return 0;}
Подякували: xrustuna1121

12

Re: Рекурсія

xrustuna112 написав:

Якраз вся суть у тому що не вмію написати рекурсією те, що можу написати циклом

Щось непомітно, щоб ви намагалися. А без цього не навчитеся.
Рекурсію легше сприймати функціонально, а не ітераційно. Не "ми робимо ще один крок", а "x - це такий x, який...". Визначення через поняття. "Сума цифр числа - це остання цифра плюс сума цифр числа, діленого націло на 10", якщо брати попередній приклад. Так і тут - треба лише здогадатися, що в рекурсивну функцію можна передавати більше одного параметра.

13 Востаннє редагувалося wander (08.11.2020 23:49:06)

Re: Рекурсія

koala написав:

Можна навіть без розгалужень, якщо вам цікаво.

#include <iostream>

// for x >= 2
bool is_prime(std::size_t const x, std::size_t const i = 2) noexcept
{
    return i * i <= x ? (x % i) && is_prime(x, i + 1) : 1;
}

int main()
{
    std::cout << std::boolalpha << is_prime(12);
}

Трішки спростив собі роботу, звісно, зате в один рядок :)

Правда не знаю кому це потрібно.

Подякували: leofun01, ch0r_t, koala, xrustuna1124

14

Re: Рекурсія

wander, ви відповідаєте за тих, кого приручили.

15

Re: Рекурсія

koala написав:

wander, ви відповідаєте за тих, кого приручили.

Але ж зате як гарно і просто.
І іншим наука буде не дораджувати бредні коли свідомість в тумані безсоння(це я про себе).

16 Востаннє редагувалося koala (09.11.2020 13:23:24)

Re: Рекурсія

std::cout << std::boolalpha << is_prime(1); //OOPS

Про поганий стиль я краще взагалі промовчу, якийсь обфускований код.

17 Востаннє редагувалося wander (09.11.2020 13:49:23)

Re: Рекурсія

koala написав:
std::cout << std::boolalpha << is_prime(1); //OOPS

Про поганий стиль я краще взагалі промовчу, якийсь обфускований код.

А коментар я для кого залишав?)

wander написав:
// for x >= 2

А до чого тут стиль? оО
Мені стало цікаво, як написати максимально мінімалістично, без циклів і if'ів.
Більше нічого.

Прихований текст

І взагалі, я не бачу сенсу обговорювати стиль/стилі тут, якщо у вас є конкретні претензії, прошу дуже в ПП.