Массивы меняют свои значения при каждой рекурсии

Вот мой код. Как видите, для результатов я использую массивы s1, s2, ... и т. д. Но когда я рекурсивно меняю s1, s2 и т.д., он изменяется на всех этапах рекурсии. В результате первый s1 = последний s1. Как это исправить? Чтобы на каждом шаге рекурсии были разные значения s1, s2 и т. д. Я знаю, что проблема в том, что я передаю массивы в функции по значению, но не знаю, как это исправить. Спасибо (извините за мой англ .: p)

    #include "pch.h"
    #include<iostream>
    #include<cstdio>
    #include<conio.h>
    #include<cstdlib>
    #include<cmath>
    #include<ctime>
    #include<clocale>
    #include <iomanip>
    using namespace std;

    void vivod(int **matrix, int n);
    int** Matrix_Add(int **a, int **b, int **c, int n, int x1, int y1, int x2, int y2);
    int** Matrix_Sub(int **a, int **b, int **c, int n, int x1, int y1, int x2, int y2);
    int** Matrix_Multiply(int **a, int **b, int **c, int x1, int y1, int x2, int y2, int n);
    int** strassen(int  **a, int **b, int **c, int **s1, int **s2, int **s3, int **s4, int **s5, int **s6, int **s7, int **s8, int **m1, int **m2, int **m3, int **m4, int **m5, int **m6, int **m7, int **t1, int **t2, int** c11, int** c12, int** c21, int** c22, int m, int n, int x1, int y1, int x2, int y2);
    int** Naive_Multiply(int  **a, int **b, int **c, int n);

    int main()
    {
        setlocale(LC_ALL, "Russian");
        int n;
        cout << "Enter the N:";
        cin >> n;
        int **A = new int*[n];
        int **B = new int*[n];
        int **C = new int*[n];
        int **k = new int*[n];
        int **s1 = new int*[n];
        int **s2 = new int*[n];
        int **s3 = new int*[n];
        int **s4 = new int*[n];
        int **s5 = new int*[n];
        int **s6 = new int*[n];
        int **s7 = new int*[n];
        int **s8 = new int*[n];
        int **m1 = new int*[n];
        int **m2 = new int*[n];
        int **m3 = new int*[n];
        int **m4 = new int*[n];
        int **m5 = new int*[n];
        int **m6 = new int*[n];
        int **m7 = new int*[n];
        int **t1 = new int*[n];
        int **t2 = new int*[n];
        int **c11 = new int*[n];
        int **c12 = new int*[n];
        int **c21 = new int*[n];
        int **c22 = new int*[n];
        int **buff = new int*[n];
        for (int i = 0; i < n; i++)
        {
            buff[i] = new int[n];
            A[i] = new int[n];
            B[i] = new int[n];
            C[i] = new int[n];
            k[i] = new int[n];
            s1[i] = new int[n];
            s2[i] = new int[n];
            s3[i] = new int[n];
            s4[i] = new int[n];
            s5[i] = new int[n];
            s6[i] = new int[n];
            s7[i] = new int[n];
            s8[i] = new int[n];
            m1[i] = new int[n];
            m2[i] = new int[n];
            m3[i] = new int[n];
            m4[i] = new int[n];
            m5[i] = new int[n];
            m6[i] = new int[n];
            m7[i] = new int[n];
            t1[i] = new int[n];
            t2[i] = new int[n];
            c11[i] = new int[n];
            c12[i] = new int[n];
            c21[i] = new int[n];
            c22[i] = new int[n];
        }
        for (int i = 0; i < n; i++)
            for (int j = 0; j < n; j++) {
                A[i][j] = rand() % 10;
                B[i][j] = rand() % 10;
            }
        cout << "First Matrix:" << endl;
        vivod(A, n);
        cout << "Second Matrix:" << endl;
        vivod(B, n);
        int begin = clock();
        //for (int i =0; i < 100; i++)
        k = Naive_Multiply(A, B, k, n);
        int end = clock();
        cout << "Naive Multiply tacts: " << end - begin << endl;
        vivod(k, n);
        int begin2 = clock();
        //for (int i = 0; i < 100; i++)
        C = strassen(A, B, C, s1, s2, s3, s4, s5, s6, s7, s8, m1, m2, m3, m4, m5, m6, m7, t1, t2, c11, c12, c21, c22, n, n, 0, 0, 0, 0);
        int end2 = clock();
        cout << "Shtrassen tacts: " << end2 - begin2 << endl;
        vivod(C, n);
        for (int i = 0; i < n; i++)
        {
            delete[] A[i];
            delete[] B[i];
            delete[] C[i];
            delete[] k[i];
            delete[] s1[i];
            delete[] s2[i];
            delete[] s3[i];
            delete[] s4[i];
            delete[] s5[i];
            delete[] s6[i];
            delete[] s7[i];
            delete[] s8[i];
            delete[] m1[i];
            delete[] m2[i];
            delete[] m3[i];
            delete[] m4[i];
            delete[] m5[i];
            delete[] m6[i];
            delete[] m7[i];
            delete[] t1[i];
            delete[] t2[i];
            delete[] c11[i];
            delete[] c12[i];
            delete[] c21[i];
            delete[] c22[i];
        }
        system("pause");
        return 0;
    }
    int** strassen(int  **a, int **b, int **c, int **s1, int **s2, int **s3, int **s4, int **s5, int **s6, int **s7, int **s8, int **m1, int **m2, int **m3, int **m4, int **m5, int **m6, int **m7, int **t1, int **t2, int** c11, int** c12, int** c21, int** c22, int m, int n, int x1, int y1, int x2, int y2) {
        m = n / 2;
        if (m != 1)
        {
            s1 = Matrix_Add(a, a, s1, m, x1 + m, y1, x1 + m, y1 + m);
            s2 = Matrix_Sub(s1, a, c, m, 0, 0, x1, y1);
            s3 = Matrix_Sub(a, a, s3, m, x1, y1, x1 + m, y1);
            s4 = Matrix_Sub(a, s2, s4, m, x1, y1 + m, 0, 0);
            s5 = Matrix_Sub(b, b, s5, m, x2, y2 + m, x2, y2);
            s6 = Matrix_Sub(b, s5, s6, m, x2 + m, y2 + m, 0, 0);
            s7 = Matrix_Sub(b, b, s7, m, x2 + m, y2 + m, x2, y2 + m);
            s8 = Matrix_Sub(s6, b, s8, m, 0, 0, x2 + m, y2);

            m1 = strassen(s2, s6, m1, s1, s2, s3, s4, s5, s6, s7, s8, m1, m2, m3, m4, m5, m6, m7, t1, t2, c11, c12, c21, c22, m, m, 0, 0, 0, 0);
            m2 = strassen(a, b, m2, s1, s2, s3, s4, s5, s6, s7, s8, m1, m2, m3, m4, m5, m6, m7, t1, t2, c11, c12, c21, c22, m, m, x1, y1, x2, y2);
            m3 = strassen(a, b, m3, s1, s2, s3, s4, s5, s6, s7, s8, m1, m2, m3, m4, m5, m6, m7, t1, t2, c11, c12, c21, c22, m, m, x1, y1 + m, x2 + m, y2);
            m4 = strassen(s3, s7, m4, s1, s2, s3, s4, s5, s6, s7, s8, m1, m2, m3, m4, m5, m6, m7, t1, t2, c11, c12, c21, c22, m, m, 0, 0, 0, 0);
            m5 = strassen(s1, s5, m5, s1, s2, s3, s4, s5, s6, s7, s8, m1, m2, m3, m4, m5, m6, m7, t1, t2, c11, c12, c21, c22, m, m, 0, 0, 0, 0);
            m6 = strassen(s4, b, m6, s1, s2, s3, s4, s5, s6, s7, s8, m1, m2, m3, m4, m5, m6, m7, t1, t2, c11, c12, c21, c22, m, m, 0, 0, x2 + m, y2 + m);
            m7 = strassen(a, b, m7, s1, s2, s3, s4, s5, s6, s7, s8, m1, m2, m3, m4, m5, m6, m7, t1, t2, c11, c12, c21, c22, m, m, x1 + m, y1 + m, 0, 0);

            t1 = Matrix_Add(m1, m2, t1, m, 0, 0, 0, 0);
            t2 = Matrix_Add(t1, m4, t2, m, 0, 0, 0, 0);

            c11 = Matrix_Add(m2, m3, c11, m, 0, 0, 0, 0);
            c21 = Matrix_Sub(t2, m7, c21, m, 0, 0, 0, 0);
            c12 = Matrix_Add(t1, m5, c12, m, 0, 0, 0, 0);
            c12 = Matrix_Add(c12, m6, c12, m, 0, 0, 0, 0);
            c22 = Matrix_Add(t2, m5, c22, m, 0, 0, 0, 0);
            for (int i = 0; i < n / 2; i++)
            {
                for (int j = 0; j < n / 2; j++)
                {
                    c[i + n - 2 * m][j + n - 2 * m] = c11[i][j];
                    c[i + n - 2 * m][j + n - m] = c12[i][j];
                    c[i + n - m][j + n - 2 * m] = c21[i][j];
                    c[i + n - m][j + n - m] = c22[i][j];
                }
            }
        }
        else
        {
            c = Matrix_Multiply(a, b, c, x1, y1, x2, y2, n);
        }
        return c;
    }
    void vivod(int **matrix, int n)
    {
        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < n; j++)
            {
                cout << matrix[i][j] << " ";
            }
            cout << endl;
        }
        cout << endl;
    }
    int** Matrix_Add(int **a, int **b, int **c, int n, int x1, int y1, int x2, int y2)
    {
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                c[i][j] = a[i + x1][j + y1] + b[i + x2][j + y2];
            }
        }
        return c;
    }

    int** Matrix_Sub(int **a, int **b, int **c, int n, int x1, int y1, int x2, int y2)
    {
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                c[i][j] = a[i + x1][j + y1] - b[i + x2][j + y2];
            }
        }
        return c;
    }
    int** Matrix_Multiply(int **a, int **b, int **c, int x1, int y1, int x2, int y2, int n)
    {
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                c[i][j] = 0;
                for (int t = 0; t < n; t++) {
                    c[i][j] = c[i][j] + a[x1 + i][y1 + t] * b[x2 + t][y2 + j];
                }
            }
        }
        return c;
    }
    int** Naive_Multiply(int **a, int **b, int **c, int n)
    {
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                c[i][j] = 0;
                for (int t = 0; t < n; t++) {
                    c[i][j] = c[i][j] + a[i][t] * b[t][j];
                }
            }
        }
        return c;
    }

блин вот это

NoActualName 17.12.2018 16:22

Пожалуйста, предоставьте минимальный воспроизводимый пример. Тяжело, но упор в минимальный. Также исправьте отступ.

AndyG 17.12.2018 16:23

Использование бессмысленных имен для различных переменных, таких как s1, s2, s-whatever, делает результирующий код совершенно нечитаемым и непонятным для всех, кроме вас. Я уверен, что все эти многомерные массивы имеют особое значение. Использование осмысленных имен переменных, описывающих предназначение этих переменных, делает результирующий код более информативным и понятным. Вы хотите, чтобы ваш код был легко понятен другим, чтобы было больше шансов, что кто-то сможет понять, в чем проблема. Попробуй это сделать.

Sam Varshavchik 17.12.2018 16:29

Когда вы пишете рекурсивную функцию с более чем 30 аргументами, она вряд ли сработает. Я не знаю, в чем проблема, но передача «массивов» по ​​значению - это не так. Вам нужно работать над упрощением вашего кода, чтобы иметь хоть какой-то шанс заставить его работать. Первым шагом было бы переписать ваши функции так, чтобы они использовали только те параметры, которые им действительно нужны.

john 17.12.2018 16:30

Вы не передаете массивы рекурсивным вызовам - вы передаете указатели. У вызываемого есть собственная копия указатель, отличная от копии вызывающего, но они оба по-прежнему указывают на одни и те же данные. Кажется, вы полагаете, что при каждом рекурсивном вызове возникают глубокие копии реальных числовых данных; это не то, что происходит.

Igor Tandetnik 17.12.2018 16:38

В этом коде используются некоторые возможности C++, но этот код написан в плохом стиле C.

Marek R 17.12.2018 17:10

Для тех, кто задается вопросом, что должен делать этот код, он, вероятно, связан с вопросом OP о Strassen-matrix-products: stackoverflow.com/questions/53802871/…. Тем не менее, stackoverflow - это не служба типа «пожалуйста, просмотрите мою функцию из 100 строк кода». Как было сказано ранее, уменьшите вашу проблему до минимальный воспроизводимый пример!

chtz 11.01.2019 16:13
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
7
82
0

Другие вопросы по теме