<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Boteco Digital &#187; Algoritmos</title>
	<atom:link href="http://www.botecodigital.info/category/algoritmos/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.botecodigital.info</link>
	<description></description>
	<lastBuildDate>Thu, 26 Jan 2012 18:36:46 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Fibonacci  com Recursão</title>
		<link>http://www.botecodigital.info/algoritmos/fibonacci-com-recursao/</link>
		<comments>http://www.botecodigital.info/algoritmos/fibonacci-com-recursao/#comments</comments>
		<pubDate>Fri, 04 Sep 2009 13:01:27 +0000</pubDate>
		<dc:creator>Rodrigo Aramburu</dc:creator>
				<category><![CDATA[Algoritmos]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[fibonnaci]]></category>

		<guid isPermaLink="false">http://www.botecodigital.info/?p=630</guid>
		<description><![CDATA[Recursão ou método recursivo nada mais é do que um método que, em sua implementação, chama a si mesmo. Mas você deve estar se perguntando para que isso me serve? Bom tecnicamente você pode fazer com iteração tudo o que você pode fazer com recursão, mas para alguns problemas computacionais as soluções recursivas tornam-se mais simples. Em geral quando você pode simplificar um problema, sem deixar de ser o mesmo problema, até que ele se torne menor e de mais [...]]]></description>
			<content:encoded><![CDATA[<p>Recursão ou método recursivo nada mais é do que um método que, em sua implementação, chama a si mesmo.</p>
<p>Mas você deve estar se perguntando para que isso me serve? Bom tecnicamente você pode fazer com iteração tudo o que você pode fazer com recursão, mas para alguns problemas computacionais as soluções recursivas tornam-se mais simples. Em geral quando você pode simplificar um problema, sem deixar de ser o mesmo problema, até que ele se torne menor e de mais fácil resolução é um problema que pode ser resolvido com recursão.</p>
<p>Um exemplo clássico de Recursão é a <a href="http://pt.wikipedia.org/wiki/Seq%C3%BC%C3%AAncia_de_Fibonacci" target="_blank">Seqüência de Fibonacci</a> que é uma seqüência que se obtém somando os dois últimos números da seqüência para chegar ao próximo. Vejamos uma implementação recursiva do problema onde mostramos na tela o 6º elemento da seqüência.</p>
<pre class="brush: java; title: ; notranslate">
class Fibonacci{

    public static int fiboRecursivo(int n){
        if( n &lt;= 2){
            return 1;
        }else{
            return Fibonacci.fiboRecursivo(n - 1) + Fibonacci.fiboRecursivo(n - 2);
        }
    }

    public static void main(String args[]){
        int i = Fibonacci.fiboRecursivo(6);
        System.out.println(i);
    }

}
</pre>
<p>O problema da seqüência de Fibonacci pode ser resolvido pela fórmula F(n-1)+F(n-2) sendo que </strong>n</strong> é posição do elemento dentro da seqüência. Como sabemos o primeiro e o segundo elementos da seqüência são <strong>1</strong> chegamos a seguinte simplificação do problema.</p>
<ul>
<li>SE a posição for menor ou igual a 2 retornamos <strong>1</strong></li>
<li>SENÂO simplificamos o problema, tentamos descobrir os dois elementos anteriores ao elemento que queremos, fazemos isso<br />
    chamando o método fiboRecursivo e somamos suas saídas.</li>
</ul>
<p>Ok, o código fica simples, mas e ai? Como ele é executado?</p>
<p>Toda chamada de um método é empilhada em um estrutura de pilha (memória Stack) que isola a área de memória de cada método. Quando fazemos uma chamada a um método a seqüência de execução é parada e passa a executar as instruções que o método chamado contem. O método chamado é empilhado na memória Stack(pilha) e após sua execução é retirado da memória Stack e seqüência de execução volta ao método que o chamou  e a execução prossegue normalmento. Note que o método que está sendo executado sempre estará no topo da memória Stack.</p>
<p>Quando utilizamos chamadas recursivas estamos colocando métodos na memória Stack, para cada chamada ao método <em>fiboRecursivo()</em> uma &#8220;cópia&#8221; dele é colocada na memória e só será retirada quando as chamadas do topo da pilha parar de chamar o métodos e retornar algum valor.</p>
<p>Essa &#8220;cópia&#8221; é totalmente independente das outras, tem seu próprio escopo, variáveis locais e como qualquer método podem manipular atributos.</p>
<div style="text-align:center">
<img src="http://www.botecodigital.info/wp-content/uploads/2009/09/chamda_metodos-300x283.png" alt="chamada_metodos" title="chamada_metodos" width="300" height="283" class="aligncenter size-medium wp-image-638" />
</div>
<p>Um outro exemplo(mais prático) em que podemos utilizar a recursão é para <strong>listar os arquivos de um diretório e de seus subdiretórios </strong>como no exemplo abaixo. </p>
<pre class="brush: java; title: ; notranslate">
import java.io.File;
import java.util.ArrayList;
import java.util.Iterator;

public class Diretorios {

    private ArrayList&lt;File&gt; arquivos = new ArrayList&lt;File&gt;();

    public void leDiretorio(File dir){
        File[] names = dir.listFiles();
        if( names != null){
            for(int i=0 ; i &lt;names.length;i++){
                if( !names[i].isDirectory() ){
                    this.arquivos.add(names[i]);
                }else{
                    leDiretorio(names[i] );
                }

            }
        }
    }

    public static void main(String args[]){
        Diretorios d = new Diretorios();
        File f= new File(&quot;teste&quot;);
        d.leDiretorio(f);

        Iterator i = d.arquivos.iterator();
        while(i.hasNext()){
            System.out.println( i.next() );
        }

    }
}
</pre>
<p>O código do método leDiretorio faz o seguinte, ele recebe por parâmetro um File que deve ser um diretório, após isso ele lê todos os arquivos do diretório com o método <strong>listFiles()</strong>, após isso ele verifica se foi retornado algum arquivo(File), se sim ele percorre esse <em>array</em> testando se o arquivo não é um diretório ele armazena em um <em>ArrayList</em> se for ele faz chama uma chamada ao próprio método passando por parâmetro esse diretório.</p>
<p>Recursão é uma ferramenta bastante poderosa que pode simplificar muita coisa, embora tenha um custo computacional um pouco mais elevado permite a criação de códigos mais simples e por conseqüência de mais fácil manutenção.</p>
<p>Uma dica é que recursão é uma boa saída para percorrer qualquer estrutura no formato de árvore.</p>
<div id="crp_related"><h4>Posts Relacionados:</h4><ul><li><a href="http://www.botecodigital.info/java/codigo-espartano/" rel="bookmark"><img width="50" height="50" src="http://www.botecodigital.info/wp-content/uploads/2009/12/java2.png" class="crp_thumb wp-post-image" alt="Código espartano" title="Código espartano" /></a> <a href="http://www.botecodigital.info/java/codigo-espartano/" rel="bookmark" class="crp_title">Código espartano</a></li><li><a href="http://www.botecodigital.info/java/java-console-colorido/" rel="bookmark"><img width="50" height="50" src="http://www.botecodigital.info/wp-content/uploads/2009/12/java2.png" class="crp_thumb wp-post-image" alt="Java &#8211; Console Colorido" title="Java &#8211; Console Colorido" /></a> <a href="http://www.botecodigital.info/java/java-console-colorido/" rel="bookmark" class="crp_title">Java &#8211; Console Colorido</a></li><li><a href="http://www.botecodigital.info/java/lendo-e-escrevendo-xml-em-java-com-jdom/" rel="bookmark"><img width="50" height="50" src="http://www.botecodigital.info/wp-content/uploads/2012/01/java-duke-xml1.png" class="crp_thumb wp-post-image" alt="Lendo e escrevendo XML em Java com JDOM" title="Lendo e escrevendo XML em Java com JDOM" /></a> <a href="http://www.botecodigital.info/java/lendo-e-escrevendo-xml-em-java-com-jdom/" rel="bookmark" class="crp_title">Lendo e escrevendo XML em Java com JDOM</a></li><li><a href="http://www.botecodigital.info/java/validando-dados-com-expressoes-regulares-em-java/" rel="bookmark"><img width="50" height="50" src="http://www.botecodigital.info/wp-content/uploads/2009/10/java3.png" class="crp_thumb wp-post-image" alt="Validando dados com expressões regulares em Java" title="Validando dados com expressões regulares em Java" /></a> <a href="http://www.botecodigital.info/java/validando-dados-com-expressoes-regulares-em-java/" rel="bookmark" class="crp_title">Validando dados com expressões regulares em Java</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://www.botecodigital.info/algoritmos/fibonacci-com-recursao/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Passeio do Cavalo</title>
		<link>http://www.botecodigital.info/algoritmos/passeio-do-cavalo/</link>
		<comments>http://www.botecodigital.info/algoritmos/passeio-do-cavalo/#comments</comments>
		<pubDate>Sat, 07 Mar 2009 13:50:00 +0000</pubDate>
		<dc:creator>Rodrigo Aramburu</dc:creator>
				<category><![CDATA[Algoritmos]]></category>
		<category><![CDATA[desafio]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[xadrez]]></category>

		<guid isPermaLink="false">http://botecodigital.g8si.com/?p=127</guid>
		<description><![CDATA[Esta estudando um pouco de Java estes tempo e me deparei com um exercício bastante interessante no Livro do Deitel, o Passeio do cavalo. O passeio do cavalo é um problema matemático envolvendo o movimento da peça do cavalo no tabuleiro de xadrez. Coloca-se o cavalo em uma das posições de um tabuleiro de xadrez vazio e deve-se movimentar o cavalo seguindo as regras do xadrez, ou seja, movimentar o cavalo em &#8220;L&#8221; para que ele passe por todas as [...]]]></description>
			<content:encoded><![CDATA[<p>Esta estudando um pouco de <em>Java</em> estes tempo e me deparei com um exercício bastante interessante no Livro do <em>Deitel</em>, o <strong>Passeio do cavalo</strong>.</p>
<p>O <strong>passeio do cavalo</strong> é um problema matemático envolvendo o movimento da peça do cavalo no tabuleiro de xadrez. Coloca-se o cavalo em uma das posições de um tabuleiro de xadrez vazio e deve-se movimentar o cavalo seguindo as regras do xadrez, ou seja, movimentar o cavalo em &#8220;L&#8221; para que ele passe por todas as 64 casas do tabuleiro sem repetir nenhuma.</p>
<p style="text-align: center;"><img class="aligncenter" src="http://www.botecodigital.info/wp-content/imagens/movimentos_cavalor.png" alt="Movimentos realizados pela peça  do xadrez cavalo cavalo" /></p>
<p>Existem dois tipos de <strong>Passeio do Cavalo</strong> o passeio aberto, onde o cavalo para em qualquer casa do tabuleiro  e o passeio fechado onde o cavalo para em uma casa em que, no próximo movimento, pare na casa onde começou.</p>
<p><a href="http://www.botecodigital.info/wp-content/donwloads/PasseioCavalo.rar" target="_blank">Aqui</a> você pode fazer o download do código que eu criei em <em>Java</em> de um passeio aberto, ele segue um <a href="http://pt.wikipedia.org/wiki/Heuristica" target="_blank">heurística</a> de acessibilidade que consta no livro do <em>Deitel</em> que pode ser vista abaixo.</p>
<p style="text-align: center;"><img class="aligncenter" title="Heurística para a resolução do problema do passeio do cavalo" src="http://www.botecodigital.info/wp-content/imagens/heuristica.png" alt="" /></p>
<p>A heurística de acessibilidade consiste em que quanto mais no canto o cavalo está mais difícil é move-lo, então estas casas devem ser passadas primeiro, como vemos na imagem da heurística acima, as casas dos quatro cantos permitem somente dois movimentos, enquanto as casas centrais permitem todos os oito.</p>
<p>Foi isso então, se alguém quiser modificar o código(que não está muito elegante) fique a vontade, só pesso que deixe  um comentário com o código ou me envie por e-mail para mim anexar ao post.</p>
<div id="crp_related"><h4>Posts Relacionados:</h4><ul><li><a href="http://www.botecodigital.info/css/css-sprite/" rel="bookmark"><img width="50" height="50" src="http://www.botecodigital.info/wp-content/uploads/2009/01/css.png" class="crp_thumb wp-post-image" alt="CSS Sprite" title="CSS Sprite" /></a> <a href="http://www.botecodigital.info/css/css-sprite/" rel="bookmark" class="crp_title">CSS Sprite</a></li><li><a href="http://www.botecodigital.info/linux/redimensionando-imagens-em-lotebatch-process-com-gimp/" rel="bookmark"><img width="50" height="50" src="http://www.botecodigital.info/wp-content/uploads/2011/07/gimp-150x150.png" class="crp_thumb wp-post-image" alt="Redimensionando imagens em lote(Batch Process) com Gimp" title="Redimensionando imagens em lote(Batch Process) com Gimp" /></a> <a href="http://www.botecodigital.info/linux/redimensionando-imagens-em-lotebatch-process-com-gimp/" rel="bookmark" class="crp_title">Redimensionando imagens em lote(Batch Process) com Gimp</a></li><li><a href="http://www.botecodigital.info/linux/alterar-posicao-dos-botoes-de-janela-ubuntu-10-04/" rel="bookmark"><img width="50" height="50" src="http://www.botecodigital.info/wp-content/uploads/2010/06/linux2.png" class="crp_thumb wp-post-image" alt="Alterar posição dos botões de janela &#8211; Ubuntu 10.04" title="Alterar posição dos botões de janela &#8211; Ubuntu 10.04" /></a> <a href="http://www.botecodigital.info/linux/alterar-posicao-dos-botoes-de-janela-ubuntu-10-04/" rel="bookmark" class="crp_title">Alterar posição dos botões de janela &#8211; Ubuntu 10.04</a></li><li><a href="http://www.botecodigital.info/navegadores/extensoes-essenciais-para-firefox/" rel="bookmark"><img width="50" height="50" src="http://www.botecodigital.info/wp-content/uploads/2009/09/navegadores.png" class="crp_thumb wp-post-image" alt="Extensões do Firefox essenciais para um desenvolvedores web" title="Extensões do Firefox essenciais para um desenvolvedores web" /></a> <a href="http://www.botecodigital.info/navegadores/extensoes-essenciais-para-firefox/" rel="bookmark" class="crp_title">Extensões do Firefox essenciais para um desenvolvedores web</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://www.botecodigital.info/algoritmos/passeio-do-cavalo/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

