Форум программистов, компьютерный форум CyberForum.ru

Проблемы с рекурсией - C++

Восстановить пароль Регистрация
 
Alhimic
 Аватар для Alhimic
5 / 5 / 0
Регистрация: 16.10.2008
Сообщений: 77
19.05.2012, 02:08     Проблемы с рекурсией #1
Ситуация такая:
Требуется построить граф вопросника.
В main мы делим таблицу по определенному условию. потом запускаем countmnozh, передав ей таблицу, куда записать получившийся граф.
После передачи функция, если длина переданного множества mnozfalse (или mnoztrue) больше единицы, опять делим на множества и рекурсивно запускаем функцию.
Проблема состоит в том, что при запуске рекурсии localgraph спокойно переходит между двумя функциями с двумя множествами. При этом я не могу получить значение ячеек таблицы после исполнения функций.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
// Test_console.cpp : Defines the entry point for the console application.
//
 
//#include "stdafx.h"
#include "iostream"
using namespace std;
bool tablica[100][100]; 
double p[100], pe[100];
unsigned short q,t,nomgraph, mbet[500][500], tit[100][100][2];// graph[100][200]; //graph: 1-по каждому начальному вопросу; 2 и 3 - таблица смежности, сначала вопросы, потом темы. Если от 2 к 3 путь по правильному ответу, то единица, если по неправильному, то два. 
unsigned short ci[100], csumm;
 
void countmnozh(unsigned char razm, unsigned char nomvopr, unsigned short graph[100][200], unsigned short mnoz[100], bool put, double tim, double wei){
                //razm - размер множества (число элем)
                //nomvopr - вопрос, с которого формируется мно-во
                //graph[100][200]- таблица смежности
                //mnoz - множество тем
                //put - по правильному ответу пошло или нет
                //tim - время
                //как вариант передавать таблицу строящегося графа во время вызова функции. Она получается доступна на всем пути построения, при этом она может быть двумерна
                //так как она отражает только один вариант пути. Таблица смежности графа. И при каждом новом вызове она будет дополняться, копироваться и варироваться.
                //Также передавать что-то (переменную или массив), где будет считаться время выполнения графа. Скорее всего как-то выполнение всего графа. Надо знать вес каждого вопроса
                //А то мы узнаем только в конце построения графа. 
                printf("Start func infunc put=%d nomvopr=%d\n", put, nomvopr);
                if (razm==1){
                    unsigned char nomt;
                    if (put) {//k+q+1 потому что в таболице смежности идут сначала вопросы, потом темы, из-за этого путь к теме так прописывается
                        nomt=mnoz[0];
                        graph[nomvopr][nomt+q]=1;
                    } else {
                        nomt=mnoz[0];
                        graph[nomvopr][nomt+q]=2;
                    }
                    tim=0;
                    wei=pe[nomt];
                    printf("infunc nomv =%d razm=%d End Func\n",nomvopr,razm);
                    //cout<<"tim="<<tim<<" wei="<<wei<<"\n";
                /*} else if(razm==2) {
                    unsigned char nomt=mnoz[0];
                    wei=pe[nomt];
                    if (tablica[nomvopr][nomt]==true)
                        graph[nomvopr][nomt+q]=1;
                    else graph[nomvopr][nomt+q]=2;
                    nomt=mnoz[1];
                    wei+=pe[nomt];
                    if (tablica[nomvopr][nomt]==true)
                        graph[nomvopr][nomt+q]=1;
                    else graph[nomvopr][nomt+q]=2;
                    tim=wei*ci[nomvopr];
                    printf("infunc nomv =%d razm=%d \n",nomvopr,razm);*/
                }else {
                    printf("razm=%d nomvopr=%d\n",razm,nomvopr);
                    unsigned short localgraph[100][200];
                    double *localtime=new double[q];
                    unsigned char counter=0;
                    unsigned char *nomq=new unsigned char[q];
                    tim=65534;
                    for (unsigned short i=0; i<q; i++){ //Еси вопрос на данных наборах состояний изменяет свое значение, значит для него строим граф
                        bool f=false;
                        for (unsigned char k=0; k<razm-1; k++){
                            unsigned short the1=mnoz[k];
                            unsigned short the2=mnoz[k+1];
                            if (tablica[i][the1]!=tablica[i][the2]){ f=true; 
                            printf("i=%d  k=%d  the1=%d, the2=%d tabl1=%d tabl2=%d f=%d break\n",i,k,the1,the2,tablica[i][the1], tablica[i][the2],f);
                            break;};
                            printf("i=%d  k=%d  the1=%d, the2=%d tabl1=%d tabl2=%d f=%d\n",i,k,the1,the2,tablica[i][the1], tablica[i][the2],f);         
                            //cout << "i="<<i<<"  k="<<k<<"  the1="<<the1<<"  the2="<<the2<<"  f="<<f<<'\n';
                        }
                        //  if(mnoz[k]!=mnoz[k+1]) f=false; //Узнаем, влияет ил вопрос на исследуемое множество
                        if (f) {
                            nomq[counter]=i;
                            unsigned short *mnoztrue, *mnozfalse, tr, fa;
                            mnoztrue= new unsigned short[t];
                            mnozfalse= new unsigned short[t];
                            tr=0; fa=0;
                            for (unsigned short k=0; k<razm; k++) {//номер темы
                                unsigned short the1=mnoz[k];
                                if(tablica[i][the1]==true) {
                                    cout <<"infunc true+="<<the1<<"   ";
                                    mnoztrue[tr]=the1; 
                                    tr++;
                                } else {
                                    cout <<"infunc false+="<<the1<<"   ";
                                    mnozfalse[fa]=the1;
                                    fa++;
                                }
                            }
                            //НЕ отображается, когда идет переход по вопросам. А только к результатам
                            double we[2], ti[2];
                            if (put) localgraph[nomvopr][i]=1; //заполняем одно поле в Localgraph
                            else localgraph[nomvopr][i]=2;
                            cout <<"\nLocalgraph pri puti vopros-vopros "<<localgraph[nomvopr][i]<<" nomv="<<(short)nomvopr<<" i="<<i<<'\n';
                        /*  cout <<"After if and put vopr\n";
                            for (unsigned char i=0; i<q; i++){
                                for (unsigned char k=0; k<t+q+1; k++) {
                                    cout << localgraph[i][k] <<"  ";
                                }
                                cout << '\n';
                           }*/
                           //localgraph[nomvopr][i]
                            cout <<"pered start funcs i="<<i<<"  in func tr="<<tr<<"  fa="<<fa<<"\n";
                            countmnozh(tr, i, localgraph, mnoztrue, true, ti[0], we[0]);
                            printf("Betwen funcs i=%d nomv=%d:\n",i,nomvopr); //Вот тут спокойно переходит Localgraph между функциями
                            countmnozh(fa, i, localgraph, mnozfalse, false, ti[1], we[1]);
                            printf("Aftar Recurs i=%d nomv=%d:\n",i,nomvopr); //Но получить к ней доступ у нас не удавется. Только к тому полю, что мы заполнили выше
                            for (unsigned char d=0; d<q; d++){
                                for (unsigned char s=0; s<t+q+1; s++) {
                                    cout << localgraph[d][s] <<"  ";
                                }
                                cout << '\n';
                           }
                           cout << '\n';
                            localtime[counter]=ci[i]*(we[0]+we[1])+ti[0]+ti[1];
                            if(localtime[counter]<tim){
                                //nom=i;
                                tim=localtime[counter];
                                wei=we[0]+we[1];
                                graph=localgraph;
                            }
                            graph=localgraph; //Убрать, когда в конечную буду переносить
                            
                          /* for (unsigned char i=0; i<q; i++){
                                for (unsigned char k=0; k<t+q+1; k++) {
                                    cout << graph[i][k] <<"  ";
                                }
                                cout << '\n';
                           }*/
                            counter++;
                        }
                    }
                    cout<<"End Func\n";
                }   
            }
 
int main()
{
    unsigned int *time=new unsigned int[q];
    unsigned short graph[100][200];
    unsigned short localgraph[100][200];
    csumm=65534;
    /*cout << "Vvedite Chislo voprosov";
    cin >> q;
    cout << "Vvedite Chislo tem";
    cin >> t;*/
    q=4;
    t=4;
    /*for (unsigned char i=0; i<q; i++){
        printf("i=%d  ",i);
        for (unsigned char k=0; k<=t; k++) {
            printf("k=%d  ",k);
            //cout <<"k="<<k<<"  ";
            cin >> tablica[i][k];
        }
        //cout <<"i="<<i<<"   ";
    }*/
    tablica[0][0]=1;
    tablica[0][1]=0;
    tablica[0][2]=1;
    tablica[0][3]=1;
    tablica[0][4]=1;
    tablica[1][0]=1;
    tablica[1][1]=1;
    tablica[1][2]=0;
    tablica[1][3]=0;
    tablica[1][4]=1;
    tablica[2][0]=1;
    tablica[2][1]=1;
    tablica[2][2]=1;
    tablica[2][3]=0;
    tablica[2][4]=1;
    tablica[3][0]=1;
    tablica[3][1]=1;
    tablica[3][2]=0;
    tablica[3][3]=0;
    tablica[3][4]=0;
    for (unsigned char i=0; i<q; i++){
        for (unsigned char k=0; k<=t; k++) {
            cout << tablica[i][k] <<"  ";
        }
        cout << '\n';
    }
    for (unsigned char i=0; i<1; i++){ //счетчик номера вопроса
        unsigned short *mnoztrue, *mnozfalse, tr, fa;
        mnoztrue= new unsigned short[t];
        mnozfalse= new unsigned short[t];
        tr=0; fa=0;
        for (unsigned short k=0; k<=t; k++) {//номер темы
            if(tablica[i][k]==true) {
                cout <<"true+="<<k<<"\n";
                mnoztrue[tr]=k; 
                tr++;
            } else {
                cout <<"false+="<<k<<"\n";
                mnozfalse[fa]=k;
                fa++;
            }
        }
        double we[2];
        unsigned int ti[2];
        cout <<"Main tr="<<tr<<"  fa="<<fa<<"\n";
        //countmnozh(tr, i, graph[i], mnoztrue, true, ti[0], we[0]);
        countmnozh(tr, i, localgraph, mnoztrue, true, ti[0], we[0]);
        cout <<"Maingraph True\n";
        for (unsigned char i=0; i<q; i++){
        for (unsigned char k=0; k<t+q+1; k++) {
            cout << localgraph[i][k] <<"  ";
        }
        cout << '\n';
    }
        countmnozh(fa, i, localgraph, mnozfalse, false, ti[1], we[1]);
        cout <<"Maingraph False\n";
        for (unsigned char i=0; i<q; i++){
        for (unsigned char k=0; k<t+q+1; k++) {
            cout << localgraph[i][k] <<"  ";
        }
        cout << '\n';
    }
        time[i]=ci[i]+ti[0]+ti[1];
        if(time[i]<csumm){
            for (unsigned char i1=0; i<q; i++)
                    for (unsigned char i2=0; i2<=q+t; i2++)
                        graph[i1][i2]=localgraph[i1][i2];   
            csumm=time[i];
        }
    }
    for (unsigned char i=0; i<q; i++){
        for (unsigned char k=0; k<t+q+1; k++) {
            cout << localgraph[i][k] <<"  ";
        }
        cout << '\n';
    }
    system("pause");
    return 0;
}
проблема в куске

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
if (put) localgraph[nomvopr][i]=1; //заполняем одно поле в Localgraph
                            else localgraph[nomvopr][i]=2;
                            cout <<"\nLocalgraph pri puti vopros-vopros "<<localgraph[nomvopr][i]<<" nomv="<<(short)nomvopr<<" i="<<i<<'\n';
                        /*  cout <<"After if and put vopr\n";
                            for (unsigned char i=0; i<q; i++){
                                for (unsigned char k=0; k<t+q+1; k++) {
                                    cout << localgraph[i][k] <<"  ";
                                }
                                cout << '\n';
                           }*/
                           //localgraph[nomvopr][i]
                            cout <<"pered start funcs i="<<i<<"  in func tr="<<tr<<"  fa="<<fa<<"\n";
                            countmnozh(tr, i, localgraph, mnoztrue, true, ti[0], we[0]);
                            printf("Betwen funcs i=%d nomv=%d:\n",i,nomvopr); //Вот тут спокойно переходит Localgraph между функциями
                            countmnozh(fa, i, localgraph, mnozfalse, false, ti[1], we[1]);
                            printf("Aftar Recurs i=%d nomv=%d:\n",i,nomvopr); //Но получить к ней доступ у нас не удавется. Только к тому полю, что мы заполнили выше
                            for (unsigned char d=0; d<q; d++){
                                for (unsigned char s=0; s<t+q+1; s++) {
                                    cout << localgraph[d][s] <<"  ";
                                }
                                cout << '\n';
                           }
если запустить программу, то видно, что значения таблицы при первом выводе передаются в таблицу при втором выводе. Однако когда мы хотим напечатать, у нас ничего не получается получить, кроме того, что мы записали до запуска функций.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.05.2012, 02:08     Проблемы с рекурсией
Посмотрите здесь:

C++ Задача с рекурсией
с++ с рекурсией C++
C++ Задача с рекурсией!
Помогите с рекурсией C++
C++ Не получается с рекурсией
C++ Бинарное с рекурсией
C++ выручите с рекурсией
программа с рекурсией C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

Текущее время: 04:26. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru