alves077 Posted February 19, 2013 at 08:18 PM Report #496211 Posted February 19, 2013 at 08:18 PM (edited) Boa noite, Queria percorrer uma matriz recursivamente, mas estou com dificuldades, ele entra em ciclo infinito e não pára. int rec(int x, int y, int rows,int tabela[50][50]) { if(x==rows-1) { return 0; } else { if(tabela[x][y]==0) { printf(",(%d,%d)",(x+1),y); rec(x+1,y,rows,tabela); } else { printf(",(%d,%d)",i+1,(j)+1); rec(x+1,y+1,rows,tabela); } } } Queria que ele fizesse determinado print em alguns índices da tabela, alguma ideia do que possa ser? Não sei se estou a fazer o melhor uso para a recursividade... Obrigado pela atenção, alves077 Edited February 19, 2013 at 09:02 PM by alves077
HappyHippyHippo Posted February 19, 2013 at 08:24 PM Report #496212 Posted February 19, 2013 at 08:24 PM int rec(int x, int y, int rows,,int tabela[50][50]) // A // | // que é isto ? IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
alves077 Posted February 19, 2013 at 08:53 PM Author Report #496217 Posted February 19, 2013 at 08:53 PM Ups... ja editei.. engano...
HappyHippyHippo Posted February 19, 2013 at 08:58 PM Report #496219 Posted February 19, 2013 at 08:58 PM antes de mais : meteste "este" código num ficheiro e compilaste ? IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
alves077 Posted February 19, 2013 at 09:05 PM Author Report #496221 Posted February 19, 2013 at 09:05 PM Não estava a versão completa, entretanto diminui a função não cheguei a compilar mas a ideia é esta, tenho alguns erros sintaxe, mas a logica é o que tenho,. Obrigado pela atenção, alves077
HappyHippyHippo Posted February 19, 2013 at 09:28 PM Report #496224 Posted February 19, 2013 at 09:28 PM entretanto diminui a função não cheguei a compilar mas estou com dificuldades, ele entra em ciclo infinito e não pára. como podes afirmar se entra em ciclo infinito sem confirmação ? IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
alves077 Posted February 19, 2013 at 09:45 PM Author Report #496232 Posted February 19, 2013 at 09:45 PM Única coisa que alterei foi so mais uns casos (else if), não me parecia que fosse por isso, pensei que fosse mais pelo modo como utilizo a recursão. Chamo a função no main com rec(0,0,tabela). Depois quero andar entre determinados pontos (x,y), e verifico qual o ponto, e chamo recursivamente nesse ponto, se chegasse ao final da matriz, entrava naquele if, mas ele percorria sem parar.... Obrigado pela atenção, alves077
HappyHippyHippo Posted February 19, 2013 at 09:50 PM Report #496233 Posted February 19, 2013 at 09:50 PM é convenção que x são os valores na mesma linha, no entanto, estás a comparar com o número de linha ? IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
alves077 Posted February 19, 2013 at 09:52 PM Author Report #496234 Posted February 19, 2013 at 09:52 PM O x,y são as coordenadas actuais (x=linha,y=colunas), enquanto o rows é o número máximo de linhas possiveis. Restando a tabela que é a matriz de inteiros
HappyHippyHippo Posted February 19, 2013 at 10:03 PM Report #496236 Posted February 19, 2013 at 10:03 PM o código apresentado não deverá entrar um ciclo infinito/longo se o valor de entra de "x" for menor que o valor de "rows" agora, o problema é : - ou não apresentaste todo o código - ou o ciclo infinito encontrasse noutro local não apresentado (ciclo exterior) IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
alves077 Posted February 19, 2013 at 10:23 PM Author Report #496240 Posted February 19, 2013 at 10:23 PM Como tinha o código: int rec(int x, int y, int rows,int matriz[50][50]) { if(x==rows-1) { return 0; } else { if(matriz[x][y]!=0) { if(matriz[x][y]==1) { printf("%d,%d",(i+1),(j)+1); rec(x+1,y,rows,matriz); sleep(3); } else if(matriz[x][y]==2) { printf("%d,%d",i-1,j); rec(x-1,y,rows,matriz); } else if(matriz[x][y]==3) { printf("%d,%d"(i+1,j+1); rec(x+1,y-1,rows,matriz); } else if(matriz[x][y]==4) { printf("%d,%d",i+11,j-1); rec(x-1,y+1,rows,matriz); } } } } No main chamava esta função num ciclo, mas tenho a garantia que só entra uma vez na condição dentro da função. já fiz printf sem a parte recursiva da função e ele só da output uma vez, logo só entra uma vez na função. Obrigado pela atenção, alves077
HappyHippyHippo Posted February 19, 2013 at 10:42 PM Report #496245 Posted February 19, 2013 at 10:42 PM (edited) agora só falta saber a matriz que estás a usar, o x e o y (porque consigo criar aqui uma matrix que te poem andar à roda sem para em 3 tempos) 1 2 3 resultado : baixo->cima->baixo->cima->baixo->cima ps : vez a diferença => não dás o código, não tens resposta, dás o código, tens resposta ... Edited February 19, 2013 at 10:43 PM by HappyHippyHippo IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
alves077 Posted February 19, 2013 at 11:06 PM Author Report #496248 Posted February 19, 2013 at 11:06 PM Tens razão HappyHippyHippo, não quis por o código para não carregar isto, formatei, mas formatei mal.... Tem ideia como posso evitar isso? Queria andar em certos índices na matriz, não percorrendo toda, recursivamente pareceu me boa ideia, mas assim como faço realmente isto não saí daqui... Obrigado pela atenção, alves077
HappyHippyHippo Posted February 19, 2013 at 11:12 PM Report #496249 Posted February 19, 2013 at 11:12 PM depende sempre do que queres fazer, por ventura o que estás a tentar fazer não é a melhor solução para o problema. no entanto, existe um passo para resolver este problema - "verificação de que não voltas ao mesmo local" isso pode ser feito de várias maneiras, mas a mais simples é teres uma matriz auxiliar do mesmo tamanho que esta, inicializada a zeros, e actualizada a 1 sempre que visitas uma posição. quando saltas para uma posição que não tenha um valor a zero, significa que voltaste a uma posição já visitada e imperativamente entrarás num ciclo IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
alves077 Posted February 19, 2013 at 11:51 PM Author Report #496256 Posted February 19, 2013 at 11:51 PM Estava a ver se não acrescentava outra matriz há solução, já estou a ocupar demasiada memória, sem essa solução não consigo prevenir ciclos? O problema é mais ou menos, em cada índice o conteúdo desse índice que leio diz me para onde devo ir na matriz. Posso sempre percorrer a matriz normalmente com dois ciclos, em cada entrada vejo a entrada actual se for para fazer printf, faço e printf a que o conteúdo do ponto disser, e meto esse ponto como lido, e sigo mas acho que isto não bate certo... Obrigado pela atenção, alves077
HappyHippyHippo Posted February 20, 2013 at 10:33 AM Report #496276 Posted February 20, 2013 at 10:33 AM acho que houve uma actualização durante a noite que fez apagar o meu post ... é assim, existe uma solução para o teu caso. como não existem valores negativos na tua matrix, o que podes fazer é: - sempre que chegas a uma nova posição (chamada da função) - verificas se o valor é negativo - se sim, então entraste num ciclo - se não, altera o valor para o negativo (multiplica por -1) podes também criar uma função auxiliar que "limpa" o processo ao iterar toda a matriz e multiplica todos os valores negativos por -1 IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
alves077 Posted February 20, 2013 at 05:09 PM Author Report #496310 Posted February 20, 2013 at 05:09 PM Ok, acho que a funcionar como quero, multiplicar por -1 é uma boa ideia.. Obrigado pela ajuda, alves077
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now