Информатика

С помощью рекурсии и языка программирования C разместите операторы +, -, *, / между цифрами от 1 до 9 таким образом

С помощью рекурсии и языка программирования C разместите операторы +, -, *, / между цифрами от 1 до 9 таким образом, чтобы получить заданное число. Создайте функцию для решения этой задачи через рекурсию.
Верные ответы (1):
  • Liska
    Liska
    67
    Показать ответ
    Решение:
    Чтобы решить эту задачу с помощью рекурсии и языка программирования C, мы можем создать функцию, которая будет перебирать все возможные комбинации операторов и цифр. Каждый раз, когда мы добавляем оператор, мы рекурсивно вызываем функцию для оставшейся части чисел.

    Вот пример кода, который решает данную задачу:

    c
    #include

    // Рекурсивная функция для перебора комбинаций операторов и чисел
    void findExpression(int target, int currentNum, int sumSoFar, int prevNum, char expression[])
    {
    // Базовый случай: если мы достигли конца чисел
    if (currentNum > 9)
    {
    // Если текущая сумма равна заданному числу, то выводим выражение
    if (sumSoFar == target)
    {
    printf("%s\n", expression);
    }
    return;
    }

    // Пробуем добавить оператор "+"
    expression[currentNum * 2 - 2] = "+";
    expression[currentNum * 2 - 1] = "0" + currentNum;
    findExpression(target, currentNum + 1, sumSoFar + currentNum, currentNum, expression);

    // Пробуем добавить оператор "-"
    expression[currentNum * 2 - 2] = "-";
    findExpression(target, currentNum + 1, sumSoFar - currentNum, -currentNum, expression);

    // Пробуем добавить оператор "*"
    expression[currentNum * 2 - 2] = "*";
    expression[currentNum * 2 - 1] = "0" + currentNum;
    findExpression(target, currentNum + 1, sumSoFar - prevNum + prevNum * currentNum, prevNum * currentNum, expression);

    // Пробуем добавить оператор "/"
    if (currentNum != 0) // Проверяем, что делитель не равен 0
    {
    expression[currentNum * 2 - 2] = "/";
    expression[currentNum * 2 - 1] = "0" + currentNum;
    findExpression(target, currentNum + 1, sumSoFar - prevNum + prevNum / currentNum, prevNum / currentNum, expression);
    }
    }

    // Функция для получения выражений
    void generateExpressions(int target)
    {
    char expression[17]; // Массив для хранения выражения
    expression[16] = "\0"; // Добавляем символ конца строки

    findExpression(target, 1, 1, 1, expression);
    }

    int main()
    {
    int target;

    printf("Введите заданное число: ");
    scanf("%d", &target);

    printf("Все возможные выражения:\n");
    generateExpressions(target);

    return 0;
    }


    Пример:
    Предположим, что мы хотим получить число 7. Мы запускаем программу и вводим число 7. Программа выведет все возможные выражения, которые равны 7.

    Совет:
    Чтобы лучше понять, как работает рекурсия в данной задаче, следует внимательно изучить, как изменяются значения переменных при каждом рекурсивном вызове функции `findExpression()`. Рекурсивное программирование требует понимания базовых случаев и рекурсивных вызовов.

    Упражнение:
    Напишите программу, которая найдет все возможные комбинации операторов и чисел от 1 до 9, чтобы получить число 24.
Написать свой ответ: