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

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

Восстановить пароль Регистрация
 
Deathsoul
0 / 0 / 0
Регистрация: 18.04.2010
Сообщений: 3
01.06.2010, 20:12     из рекурсии - цикл #1
помогите убрать рекурсию и поставить 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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.06.2010, 20:12     из рекурсии - цикл
Посмотрите здесь:

использование рекурсии C++
рекурсии... C++
C++ Рекурсии.
C++ Цикл for/Цикл while Помогите срочно пожалуйста...
использование рекурсии C++
C++ сложности по рекурсии в С++
C++ Цикл: цикл for вообще никак не воспринимается транслятором
Задание на цикл с параметром и цикл с постусловием C++

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

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

код на С

Код
#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();
}

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

Код
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 с циклом.
до завтрашнего дня
Yandex
Объявления
01.06.2010, 21:33     из рекурсии - цикл
Ответ Создать тему
Опции темы

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