Recursão?

6 respostas
M3g4d3th

Fala Pessoal, faz um tempo que não apareco por aqui, to tentando voltar a estudar Java.

Seguinte,

Tem um brother que jogou um problema na minha mão e eu não to conseguindo chegar num ponto.

Fazer um tabuleiro de xadrez de n vezes n e colocar n rainhas, aonde nenhuma rainha pode matar outra rainha.

Se por exemplo n=8, Então o tabuleiro seria de 8x8 e teríamos 8 rainhas.

Ai comecei a desenhar um tabuleiro pra pensar numa solucao. Vi como se encaixa o problema, no tabuleiro as rainhas não podem em nenhum momento estar na mesma linha e não podem estar na mesmas colunas. Isso já mata o problema da diagonal.

Então eu pensei em fazer uma array bidimensional e ir verificando com um for. Mas estou parado, acho que tenho ainda uma limitacao de código, faz mtos anos que não programo.

Ai meu amigo falou pra eu pensar em recursão, mas ai que tá, não entendi o que quer dizer recursão. Alguém tem material de estudo sobre isso?

Pra quem estiver interessado, tem esse link de como funciona o problema.
http://www.hbmeyer.de/backtrack/achtdamen/eight.htm#up

Abraco,
Vinícius

6 Respostas

ViniGodoy

Esse seu brother te deu um problema que não é computacionalmente simples para resolver:

M3g4d3th

[quote=ViniGodoy]Esse seu brother te deu um problema que não é computacionalmente simples para resolver:

A idéia é que eu to voltando a estudar, ai ele como programador, falou que seria excelente eu resolver uns problemas.
Ele me deixou um pouco com as mãos atadas, porquê a idéia era pegar a linguagem de novo.
Mas entendi agora, ele tinha me falado de vários meios de solucao, mas não tinha entendido. E acho que agora deu um brilho aqui pra voltar a programar.

Mas muito grato pela rápida resposta.

Abraco

mi.rodrigues

[quote=M3g4d3th]

ViniGodoy:
Esse seu brother te deu um problema que não é computacionalmente simples para resolver:

A idéia é que eu to voltando a estudar, ai ele como programador, falou que seria excelente eu resolver uns problemas.
Ele me deixou um pouco com as mãos atadas, porquê a idéia era pegar a linguagem de novo.
Mas entendi agora, ele tinha me falado de vários meios de solucao, mas não tinha entendido. E acho que agora deu um brilho aqui pra voltar a programar.

Mas muito grato pela rápida resposta.

Abraco

Ele começou lhe ajudando no modo hard… Você poderia começar com problemas mais simples, depois entra no problema da rainha. Faça um fibonacci e veja se você entende o processo de recursão. Abraços!

M3g4d3th
public class fibonacci {

	int fibonaccicalc(int posicao) {
		return (posicao <= 2 ? 1 : fibonaccicalc(posicao - 1) + fibonaccicalc(posicao - 2));
	}
	
	int fiboloop(int x){
		for(int i = x;i<=10;i++){
		x=i;
		}
		return x;
	}
	
	
	public static class testFibonacci {
		
		public static void main(String[] args) {
			
			fibonacci Fibo = new fibonacci();
			int v = Fibo.fibonaccicalc(Fibo.fiboloop(0));
			System.out.println(v);
			
		}
	}
}

Galera, o amigo ai de cima falou pra comecar por Fibonacchi, então comecei.

Mas estou tendo um problema, no método fiboloop, eu quero que ele faca a contagem de 1, 2 , 3 até 10. E que retorne isso, mas só estou conseguindo retornar o final, que no caso é o 10.
Fazendo o método como void desde int eu consegui fazer a contagem correta, mas na hora de instanciar o método em ‘int v = Fibo.fibonaccicalc(Fibo.fiboloop(0));’ ele afirma que o método não é um int, claro.

Estou pesquisando aqui, mas se alguém puder dar uma ajuda.

Abraco e grato desde já.

fabiocortolan

Cara, no momento estou meio enrolado e não vou ter tempo p/ testar seu código, mas encontrei um código q fiz da sequencia de Fibonacci com recursividade na facul há alguns anos, talvez te ajude em alguma coisa:

public class Main {

	public static void main(String[] args) {

		for (int x = 1; x &lt; 10; x++) {
			int y = Fibonacci.cacular(x);
			System.out.println("o Fibonacci de "+x+" é " + y);
		}

	}

}
public class Fibonacci {

	public static int cacular(int n) {

		if (n == 0 || n == 1)
			return n;
		else
			return cacular(n - 1) + cacular(n - 2);
	}
}

Encontrei tbm um sistema pronto da Eight Queens com recursividade, se estiver interessado segue o código abaixo (detalhe, esse código foi copiado da internet, faz muito tempo então não me lembro a fonte, mas funciona):

public class NRainhas {
	protected int N;
	protected int contador = 0;
	protected String print = "";
	
	public NRainhas() {
	}

	public void solucionar() {
		boolean[][] tabuleiro = new boolean[N][N];
		solucionar(tabuleiro, 0);
	}

	private void solucionar(boolean[][] tabuleiro, int row) {
		final int size = tabuleiro.length;

		for(int col=0; col &lt; size; col++) {
			// Coloca rainha na posicao [row][col]
			tabuleiro[row][col] = true;

			// Se for possivel posiciona-la...
			if( ataca(tabuleiro,row,col) ) {
				if( row &lt; size-1 )
					solucionar(tabuleiro, row+1);
				else{
					print = print +" Solucao numero "+ (contador+1) + ":" + System.getProperty("line.separator");
					print(tabuleiro);
					this.contador++;
				}
			}

			// Se nao for possivel, remove a rainha desta posicao
			tabuleiro[row][col] = false;
		}
	}

	private static boolean ataca(boolean[][] tabuleiro, int row, int col) {
		final int N = tabuleiro.length;
		
		//testa se as posicoes sao regioes que estao sendo atacadas
		for(int k=1; k &lt;= row; k++) {
			if( tabuleiro[row-k][col] || 
				((col-k &gt;= 0) && tabuleiro[row-k][col-k]) ||
				((col+k &lt;  N) && tabuleiro[row-k][col+k])
			)
				return false;
		}

		return true;
	}

	private void print(boolean[][] tabuleiro) {
		final int N = tabuleiro.length;
		String q = "";

		String sepLine = "  +";
		for(int i=0; i &lt; N; i++) sepLine += " ----- +";

		for(int r=0; r &lt; N; r++) {
			print = print + sepLine + System.getProperty("line.separator");
			print = print + "  |";
			
			for(int c=0; c &lt; N; c++) {
				if (tabuleiro[r][c]) {
					q = "R";
				} else {
					q = " ";
				}
				//q = tabuleiro[r][c] ? "R" : " ";
				print = print + "   " + q + "   |";
			}
			print = print + System.getProperty("line.separator");
		}
		print = print + sepLine + "\n\n" + System.getProperty("line.separator");
		System.out.println(print);
	}
	
	public String start() {
		String numerodeRainhas ="";
		int numR = 0;
		
		JOptionPane.showMessageDialog(null,"N rainhas \n Programa que soluciona o problema" +
				" de N rainhas"," N Rainhas",JOptionPane.PLAIN_MESSAGE);
		
		numerodeRainhas = JOptionPane.showInputDialog("Entre com o numero de Rainhas para" +
				" encontrar a solução");
		
		//entrada vazia(cancelamento do panel)
		if(numerodeRainhas == null || numerodeRainhas.length() == 0){return " ";}
		
		try {
			numR = Integer.parseInt(numerodeRainhas);
		} catch (NumberFormatException ne) {
			JOptionPane.showMessageDialog(null, "Erro: a quantidade de rainhas deve ser número");
			
			this.start();
		}
		
		this.N = numR;
		
		this.solucionar();
		
		if (contador == 0){
			JOptionPane.showMessageDialog(null,"O problema de "+ N+
					" Rainhas nao possui solucoes" ," N Rainhas",JOptionPane.ERROR_MESSAGE);
			
		} else {
			JOptionPane.showMessageDialog(null,"Foram encontradas "+this.contador+
				" solucoes do problema de "+ N+" Rainhas" ," N Rainhas",JOptionPane.PLAIN_MESSAGE);
		}
		
		String s = this.print;
		
		this.print = "";
		
		return s;
	}

	public static void main(String argv[]) {
		NRainhas r = new NRainhas();
		r.start();
	}
}
Rodrigo_Sasaki

Esse é um dos poucos assuntos onde eu tenho um material pronto pra ajudar :slight_smile: É simples e curto, mas pode ser que te ajude.

http://rodrigosasaki.com/2012/10/27/recursividade/

Criado 19 de março de 2013
Ultima resposta 22 de mar. de 2013
Respostas 6
Participantes 5