Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 18.04.2010
Сообщений: 3

из рекурсии - цикл

01.06.2010, 20:12. Показов 900. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
помогите убрать рекурсию и поставить while.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int perest(int l,int **a,int **r,int *p,int n,int &sum,int &max)
{
    int i,temp;
    if(l==0)
    {
        r=Path(a,r,p,n,sum,max);
    }
    else
        for(i=0;i<l;i++)
        {
            perest(l-1,a,r,p,n,sum,max);
            if(i<l-1)
            {
                temp=p[i];
                p[i]=p[l-1];
                p[l-1]=temp;
                p=reverse(l-1,p);
            }
        }
        return 0;
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
01.06.2010, 20:12
Ответы с готовыми решениями:

Цикл де Брёйна, трабл с вызовом рекурсии
Перевожу с питона на шарп цикл Де Брейна, на английской версии лежит скрипт, который приведен ниже (слегка его подчистил до неоходимого...

Возможно ли вместо рекурсии использовать цикл?
Просто все задачи на рекурсию которые я кое-как &quot;выполнил&quot; легко пишутся с помощью циклов. Можете привести пример где нельзя использовать...

Delphi. Преобразование рекурсии в итерационный цикл
Задание: &quot;Решить задачу двумя способами – с применением рекурсии и без нее. Создайте процедуру, печатающую все возможные представления...

2
29 / 29 / 6
Регистрация: 14.12.2009
Сообщений: 79
01.06.2010, 20:54
Deathsoul, задание в студию... Без него, увы, тебе никто не сможет помочь
0
0 / 0 / 0
Регистрация: 18.04.2010
Сообщений: 3
01.06.2010, 21:33  [ТС]
Задача коммивояжера методом ветвей и границ

код на С

Code
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
#include <conio.h>
#include <stdio.h>
#include <string.h>
 
int **MATRIX_1(int &n,char name[])
{   
    FILE * f;
    f=fopen(name,"r");
    if(f==NULL)
        return NULL;
    fscanf(f,"%d ",&n);
    int **M=new int *[n];
    for (int i=0;i<n;i++)
        M[i]=new int[n];
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {   
            fscanf(f,"%d",&M[i][j]);
                printf("%d\t",M[i][j]);
        }
        printf("\n");
    }
    printf("\n");
    fclose(f);
    return M;
}
 
int **Path(int **a,int **r,int *p,int n,int &sum,int &max)
{
    int i,j,s;
    s=0;
    for(i=0;i<n-1;i++)
    {
        s=s+a[p[i]][p[i+1]];
    }
    s=s+a[p[n-1]][p[0]];
    if(s<=sum)
    {
        for(j=0;j<n;j++)
        {
            r[max][j]=p[j];
        }
    r[max][n]=s;
    sum=s;
    max++;
    }
    return r;
}
int *reverse(int k,int *p)
{
    int i,j,temp;
    j=0;
    while(j<k-1)
    {
        temp=p[j];
        p[j]=p[k-1];
        p[k-1]=temp;
        j++;
        k--;
    }
    return p;
}
 
int perest(int l,int **a,int **r,int *p,int n,int &sum,int &max)
{
    int i,temp;
    if(l==0)
    {
        r=Path(a,r,p,n,sum,max);
    }
    else
        for(i=0;i<l;i++)
        {
            perest(l-1,a,r,p,n,sum,max);
            if(i<l-1)
            {
                temp=p[i];
                p[i]=p[l-1];
                p[l-1]=temp;
                p=reverse(l-1,p);
            }
        }
        return 0;
}
 
int Kommi(char name[])
{
    int n,i,j;
    int **M=MATRIX_1(n,name);
    if(M==NULL)
        return NULL;
    int *p=new int[n];
    for(i=0;i<n;i++)
        p[i]=i;
    int **r=new int*[120];
    for(i=0;i<120;i++)
        r[i]=new int[n+1];
    int max=0;
    int sum=10000;
    perest(n,M,r,p,n,sum,max);
    printf("Bazovyi cikl \t");
    for(j=0;j<n;j++)
        printf("%d\40",r[0][j]+1);
    printf("%d\40",r[0][0]+1);
    printf("\t%d\n",r[0][n]);
    printf("\nReshenie:\n");
    for(i=1;i<max;i++)
    {
        if(r[i][n]==sum)
        {
        for(j=0;j<n;j++)
            printf("%d\40",r[i][j]+1);
        printf("%d\40",r[i][0]+1);
        printf("\t%d\n",r[i][n]);
        }
    }
}
 
void main()
{
    char name[32];
    printf ("Vvedite imya faila\n");
    fflush(stdin);
    gets(name);
    if(Kommi(name)==NULL)
        printf("\nError!\n");;
    getch();
}

код на паскале, который переделывал (но там тоже рекурсия)

Code
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
Uses CRT;
 
Const FileName = '1.txt';
N = 5;
 
Type My = Array [1..N] Of Byte;
 
Var P : My;
F : Text;
A,R : Array [1..N,1..N] of Word;
I,J,Pb,Max : Byte;
code,Sum : Word;
S,Ts : String;
 
Procedure Path(M:My);
Var I,J : Byte;
S : Word;
Begin
S := 0;
For I := 1 To N-1 Do S := S + A[M[i],M[I+1]];
S := S + A[M[N],M[1]];
If S <= Sum Then Begin
For J := 1 To N Do R[J,Max] := M[J];
Sum := S;
Inc(Max);
End;
End;
 
Procedure Reverse(K:Byte);
Var J,I,Temp : Byte;
Begin
J := 1;
While J < K Do Begin
Temp := P[J];
P[J] := P[K];
P[K] := Temp;
J := J + 1;
K := K - 1;
End;
End;
 
Procedure PerestArray(M:Byte);
Var I,Temp : Byte;
Begin
If M = 1 Then Path(P)
Else For I := 1 To M Do Begin
PerestArray(M-1);
If I < M Then Begin
Temp := P[i];
P[i] := P[M];
P[M] := Temp;
Reverse(M-1);
End;
End;
End;
 
Function Summ:Integer;
Var I : Byte;
T : Integer;
Begin
T := 0;
For I := 1 To N Do Begin
T := T + A[I,P[i]];
End;
Summ := T;
End;
 
Begin
ClrScr;
 
Assign(F,FileName);
Reset(F);
For I := 1 To N Do Begin
ReadLn(F,S);
J := 1;
While Pos(' ',S) <> 0 Do Begin
Pb := Pos(' ',S);
Ts := Copy(S,1,Pb-1);
Val(Ts, A[I,J], code);
Delete(S,1,Pb);
Inc(J);
End;
Val(S, A[I,J], code);
End;
Close(F);
 
WriteLn;
For I := 1 To N Do Begin
For J := 1 To N Do Write(A[I,J]:3);
WriteLn;
End;
 
WriteLn;
WriteLn('Reshenie:');
 
For I:=1 To N Do P[i]:=I;
Max := 0;
Sum := Maxint;
PerestArray(N);
 
For I:=1 To Max Do Begin
For J := 1 To N Do Write(R[J,I]:3);
WriteLn(Sum:5);
End;
WriteLn;
End.
Добавлено через 16 минут
ну вот и задания и готовый пример, но с рекурсией. помогите сделать функцию perest с циклом.
до завтрашнего дня
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
01.06.2010, 21:33
Помогаю со студенческими работами здесь

Как записать цикл коротко, с помощью рекурсии
Всем привет. Если честно, хотел сам решить данную задачу, но вот уже второй день ничего не выходит, а дедлайн поджимает. Поэтому прошу...

Внутренняя оптимизация рекурсии в цикл, существует ли такое?
Мне надо сделать одну хрень, можно ее сделать через цикл, но код объемный, не удобочитаемый и я могу тоже самое реализовать через рекурсию,...

Принадлежит ли заданный элемент массиву - использовать цикл вместо рекурсии
using System; namespace Recyrcy_001 { class Program { static void Main(string args) { ...

Описать методы для выполнения задания двумя способами: через цикл и используя механизм рекурсии
Последовательность из латинских букв строится следующим образом. На нулевом шаге она пуста. На каждом последующем шаге последовательность...

Создать программу по всем 3 видам циклов...цикл с параметром,цикл с условием,цикл,и цикл с предусловием...
Найти сумму чисел 1 в квадрате до 10 c квадрате...операцию возведению в степень не использовать учесть особенности получения квадратного...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Вывод данных через динамический список в справочнике
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru