<?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>Felipe Tonello &#187; Matemática</title>
	<atom:link href="http://felipetonello.com/blog/category/matematica/feed/" rel="self" type="application/rss+xml" />
	<link>http://felipetonello.com/blog</link>
	<description>Compartilhe, ajude e cresça</description>
	<lastBuildDate>Thu, 29 Jul 2010 20:35:37 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Analisando Número de Fibonacci e Recursividade</title>
		<link>http://felipetonello.com/blog/2009/01/30/analisando-numero-de-fibonacci-e-recursividade/</link>
		<comments>http://felipetonello.com/blog/2009/01/30/analisando-numero-de-fibonacci-e-recursividade/#comments</comments>
		<pubDate>Fri, 30 Jan 2009 04:54:47 +0000</pubDate>
		<dc:creator>Felipe Tonello</dc:creator>
				<category><![CDATA[Algoritmos]]></category>
		<category><![CDATA[Artigos]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[Matemática]]></category>
		<category><![CDATA[Metemática]]></category>

		<guid isPermaLink="false">http://felipetonello.com/blog/?p=191</guid>
		<description><![CDATA[O número de Fibonacci é bem conhecido no mundo da computação. Ele é representado por uma função recursiva: Calculando Tendo isso em mente é bem fácil criar um algoritmo que calcule o número de Fibonacci, certo? Na internet normalmente encontramos um algoritmo usando um método de recursão simples. Algo parecido com: Felipe: Esse artigo usa [...]]]></description>
			<content:encoded><![CDATA[<p>O <a href="http://pt.wikipedia.org/wiki/Seq%C3%BC%C3%AAncia_de_Fibonacci">número de Fibonacci</a> é bem conhecido no mundo da computação. Ele é representado por uma função recursiva:<br />
<img class="alignnone size-medium wp-image-193" title="Representação da Função de Fibonacci" src="http://felipetonello.com/blog/wp-content/uploads/2009/01/fib-rec-300x55.png" alt="Fibonacci e Proporção áurea" width="300" height="55" /></p>
<h3>Calculando</h3>
<p>Tendo isso em mente é bem fácil criar um algoritmo que calcule o número de Fibonacci, certo?<br />
Na internet normalmente encontramos um algoritmo usando um método de recursão simples. Algo parecido com:</p>
<p><em>Felipe: Esse artigo usa apenas exemplos em C++</em></p>
<p><strong>fibo1.cpp</strong></p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include &lt;iostream&gt;</span>
<span style="color: #339900;">#include &lt;cstdlib&gt;</span>
&nbsp;
<span style="color: #0000ff;">int</span> F<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> n<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>n <span style="color: #000080;">==</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>n <span style="color: #000080;">==</span> <span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">return</span> F<span style="color: #008000;">&#40;</span>n <span style="color: #000040;">-</span> <span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">+</span> F<span style="color: #008000;">&#40;</span>n <span style="color: #000040;">-</span> <span style="color: #0000dd;">2</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> argc, <span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span>argv<span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">int</span> n <span style="color: #000080;">=</span> <span style="color: #0000dd;">atoi</span><span style="color: #008000;">&#40;</span>argv<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    std<span style="color: #008080;">::</span><span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> F<span style="color: #008000;">&#40;</span>n<span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> std<span style="color: #008080;">::</span><span style="color: #007788;">endl</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<p><a href="http://pastebin.com/f2d429927">código no pastebin</a></p>
<p>Compilando:</p>
<blockquote><p>g++ -o fibo1 fibo1.cpp</p></blockquote>
<p>Rodando:</p>
<blockquote><p>./fibo1 8</p></blockquote>
<p>Deu 21, certo? Isso mesmo.</p>
<h3>Analisando a Função</h3>
<p>Mas digo para você: <strong>Não use esse programa!</strong> É totalmente ineficiente. O número de chamadas para calcular <img src="http://felipetonello.com/blog/wp-content/cache/tex_f2ef78cc1f1c158670fe0200c879ec90.png" align="absmiddle" class="tex" alt="F_{N}" /> é exatamente <img src="http://felipetonello.com/blog/wp-content/cache/tex_d355c47a1af9a7a9c8db72fe21a904b1.png" align="absmiddle" class="tex" alt="F_{N+1}" />. A função calcula recursivamente o mesmo número quantas vezes a chamar. Como podemos ver, a taxa de crescimento do número de Fibonacci tende a <a href="http://pt.wikipedia.org/wiki/Propor%C3%A7%C3%A3o_%C3%A1urea">Proporção áurea</a>:<br />
<img class="alignnone size-full wp-image-192" title="Fibonacci e Proporção áurea" src="http://felipetonello.com/blog/wp-content/uploads/2009/01/fibfunc.png" alt="Fibonacci e Proporção áurea" width="350" height="75" /></p>
<p>Lembrando que a razão áurea é definida por:<br />
<img class="alignnone size-full wp-image-197" title="Razão áurea" src="http://felipetonello.com/blog/wp-content/uploads/2009/01/phi.png" alt="Razão áurea" width="471" height="67" /></p>
<p>Sim, fibo1.cpp é uma função exponencial com <a title="Big Oh Notation" href="http://en.wikipedia.org/wiki/Big_O_notation">Big Theta Notation</a>, em função do tempo, de:<br />
<img class="alignnone size-full wp-image-195" title="Big Theta Notation 1" src="http://felipetonello.com/blog/wp-content/uploads/2009/01/fibtheta2.png" alt="Big Theta Notation 1" width="129" height="54" /></p>
<p>O tempo de execução para computar <img src="http://felipetonello.com/blog/wp-content/cache/tex_d355c47a1af9a7a9c8db72fe21a904b1.png" align="absmiddle" class="tex" alt="F_{N+1}" /> é <img src="http://felipetonello.com/blog/wp-content/cache/tex_1904b0447484e5dc02146f97393f7c7d.png" align="absmiddle" class="tex" alt="\phi \approx 1,6" /> vezes mais demorado que para calcular <img src="http://felipetonello.com/blog/wp-content/cache/tex_f2ef78cc1f1c158670fe0200c879ec90.png" align="absmiddle" class="tex" alt="F_{N}" />. Por exemplo, já que <img src="http://felipetonello.com/blog/wp-content/cache/tex_347a548b9bfa501d8dfab29169fecd7a.png" align="absmiddle" class="tex" alt="\phi^{9} &gt; 60" /> e percebemos que nosso computador leva um segundo para calcular <img src="http://felipetonello.com/blog/wp-content/cache/tex_f2ef78cc1f1c158670fe0200c879ec90.png" align="absmiddle" class="tex" alt="F_{N}" />, então levará mais de um minuto para calcular <img src="http://felipetonello.com/blog/wp-content/cache/tex_7b3288cde05e266c7d61a5619cb0a6a1.png" align="absmiddle" class="tex" alt="F_{N+9}" /> e mais de uma hora para calcular <img src="http://felipetonello.com/blog/wp-content/cache/tex_2b345505aa2c1af734e633dd36a31af3.png" align="absmiddle" class="tex" alt="F_{N+18}" />.</p>
<p>Podemos verificar isso calculando <img src="http://felipetonello.com/blog/wp-content/cache/tex_f3e5a57b2417abcd21aae1d52825fdc3.png" align="absmiddle" class="tex" alt="F_{36}" /> e <img src="http://felipetonello.com/blog/wp-content/cache/tex_7d434a0da3291d6176b65638e4fb7b44.png" align="absmiddle" class="tex" alt="F_{45}" /></p>
<blockquote><p>pet@felipe-opensuse:~/Projetos/C++/algoritmos> time ./fibo1 36<br />
14930352                                                           </p>
<p>real    0m1.077s<br />
user    0m1.040s<br />
sys     0m0.008s<br />
pet@felipe-opensuse:~/Projetos/C++/algoritmos> time ./fibo1 45<br />
1134903170                                                         </p>
<p>real    0m54.927s<br />
user    0m54.547s<br />
sys     0m0.092s </p></blockquote>
<p>Em contraste, usando o método de <a href="http://en.wikipedia.org/wiki/Dynamic_programming">programação dinâmica</a> temos um tempo proporcional a N.</p>
<h3>Programação dinâmica</h3>
<p>Esse método consiste em guardar os valores dos números já calculados em um array. Fazendo isso, apenas checamos se o array já foi memorizado, e então retornamos o número, caso contrário calculamos recursivamente e assim por diante.<br />
Lembrando que para um int de 32 bits, <img src="http://felipetonello.com/blog/wp-content/cache/tex_24597c0d5e316e6f858b30f758a6b563.png" align="absmiddle" class="tex" alt="F_{46} = 1836311903" /> será o maior numero a ser calculado.</p>
<p><strong>fibo2.cpp</strong></p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &lt;iostream&gt;</span>
<span style="color: #339933;">#include &lt;cstdlib&gt;</span>
&nbsp;
namespace Fibonacci <span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> <span style="color: #339933;">*</span>memory<span style="color: #339933;">;</span>
    <span style="color: #993333;">int</span> F<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> n<span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #666666; font-style: italic;">// int inicializa como 0</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>memory<span style="color: #009900;">&#91;</span>n<span style="color: #009900;">&#93;</span> <span style="color: #339933;">!=</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">return</span> memory<span style="color: #009900;">&#91;</span>n<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
        <span style="color: #993333;">int</span> aux <span style="color: #339933;">=</span> n<span style="color: #339933;">;</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>n <span style="color: #339933;">&lt;</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>n <span style="color: #339933;">&gt;</span> <span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span> aux <span style="color: #339933;">=</span> F<span style="color: #009900;">&#40;</span>n<span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> F<span style="color: #009900;">&#40;</span>n<span style="color: #339933;">-</span><span style="color: #0000dd;">2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">return</span> memory<span style="color: #009900;">&#91;</span>n<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> aux<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> argc<span style="color: #339933;">,</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>argv<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> n <span style="color: #339933;">=</span> atoi<span style="color: #009900;">&#40;</span>argv<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    Fibonacci<span style="color: #339933;">::</span><span style="color: #202020;">memory</span> <span style="color: #339933;">=</span> new <span style="color: #993333;">int</span><span style="color: #009900;">&#91;</span>n<span style="color: #339933;">+</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    std<span style="color: #339933;">::</span><span style="color: #000066;">cout</span> <span style="color: #339933;">&lt;&lt;</span> Fibonacci<span style="color: #339933;">::</span><span style="color: #202020;">F</span><span style="color: #009900;">&#40;</span>n<span style="color: #009900;">&#41;</span> <span style="color: #339933;">&lt;&lt;</span> std<span style="color: #339933;">::</span><span style="color: #202020;">endl</span><span style="color: #339933;">;</span>
    delete <span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> Fibonacci<span style="color: #339933;">::</span><span style="color: #202020;">memory</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p><a href="http://pastebin.com/f12eb1fa0">código no pastebin</a></p>
<p>Compilando:</p>
<blockquote><p>g++ -o fibo2 fibo2.cpp</p></blockquote>
<p>Rodando:</p>
<blockquote><p>./fibo2 8</p></blockquote>
<p>Deu 21, de novo? =)</p>
<p>Aplicamos aqui uma técnica chamada <em>bottom-up dynamic programming</em>. Se aplica em uma função recursiva que podemos salvar tempo por armazenar valores anteriores que serão usados depois. Essa técnica tem sido usada para uma gama grande de algoritmos e aplicações. E essa simples mudança fez com que nosso algoritmo passasse de exponencial para linear.</p>
<p>Agora temos uma função, em relação ao tempo, proporcional ao N.<br />
<img src="http://felipetonello.com/blog/wp-content/uploads/2009/01/fibtheta21.png" alt="Big Theta Notation 2" title="Big Theta Notation 2" width="113" height="50" class="alignnone size-full wp-image-198" /></p>
<h3>Comparando</h3>
<p>Fazendo vários testes, podemos chegar em uma tabela de resultados, em função do <strong>tempo</strong>:</p>
<table>
<tr>
<th>arquivo</th>
<th><img src="http://felipetonello.com/blog/wp-content/cache/tex_cb09d855eefea0dc3acd2127f86fa324.png" align="absmiddle" class="tex" alt="F_{8}" /></th>
<th><img src="http://felipetonello.com/blog/wp-content/cache/tex_f3e5a57b2417abcd21aae1d52825fdc3.png" align="absmiddle" class="tex" alt="F_{36}" /></th>
<th><img src="http://felipetonello.com/blog/wp-content/cache/tex_7d434a0da3291d6176b65638e4fb7b44.png" align="absmiddle" class="tex" alt="F_{45}" /></th>
<th><img src="http://felipetonello.com/blog/wp-content/cache/tex_58915190e9ff27470c85b6ddaaad35fe.png" align="absmiddle" class="tex" alt="F_{46}" /></th>
</tr>
<tr>
<td>fibo1.cpp</td>
<td>0m0.009s</td>
<td>0m1.156s</td>
<td>0m54.927s</td>
<td>1m29.403s</td>
</tr>
<tr>
<td>fibo2.cpp</td>
<td>0m0.007s</td>
<td>0m0.007s</td>
<td>0m0.006s</td>
<td>0m0.007s</td>
</tr>
</table>
<p>fibo2.cpp é constante? Sim! Para N relativamente pequeno <strong>fibo2.cpp</strong> calcula em tempo constante.</p>
<p>Será interessante ver até quanto esse algoritmo agüenta(ta errado né? hehe ¬¬) fazer em tempo constante. Alguém se habilita?</p>
]]></content:encoded>
			<wfw:commentRss>http://felipetonello.com/blog/2009/01/30/analisando-numero-de-fibonacci-e-recursividade/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Josephus Problem, resolvendo-o de maneira simples</title>
		<link>http://felipetonello.com/blog/2009/01/08/josephus-problem-resolvendo-o-de-maneira-simples/</link>
		<comments>http://felipetonello.com/blog/2009/01/08/josephus-problem-resolvendo-o-de-maneira-simples/#comments</comments>
		<pubDate>Thu, 08 Jan 2009 18:40:28 +0000</pubDate>
		<dc:creator>Felipe Tonello</dc:creator>
				<category><![CDATA[Algoritmos]]></category>
		<category><![CDATA[Artigos]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[Eventos]]></category>
		<category><![CDATA[Matemática]]></category>
		<category><![CDATA[Metemática]]></category>

		<guid isPermaLink="false">http://felipetonello.com/blog/?p=156</guid>
		<description><![CDATA[Josephus Problem é um problema bem legal que estudei no livro Concrete Mathematics. Josephus foi um historiador judeu do primeiro século. A lenda conta que ele e 40 de seus homens estavam presos em uma caverna pelos Romanos. Eles decidiram suicidar-se à ser capturados. Formaram um circulo e começaram a se matar, da 3ª à [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://en.wikipedia.org/wiki/Josephus_problem">Josephus Problem</a> é um problema bem legal que estudei no livro <a href="http://www.amazon.com/Concrete-Mathematics-Foundation-Computer-Science/dp/0201558025">Concrete Mathematics</a>.</p>
<p><a href="http://en.wikipedia.org/wiki/Flavius_Josephus">Josephus</a> foi um historiador judeu do primeiro século. A lenda conta que ele e 40 de seus homens estavam presos em uma caverna pelos Romanos. Eles decidiram suicidar-se à ser capturados. Formaram um circulo e começaram a se matar, da 3ª à 3ªa pessoa em ordem da fila. Como Josephus não queria morrer, ele foi capaz de escolher o melhor lugar, afim de sobreviver, e juntar-se os Romanos que o capturaram.</p>
<h3>O Problema</h3>
<p>Na prática o problema teria <em>N</em> pessoas em um círculo, iria ser percorrido <em>M &#8211; 1</em> pessoas e o <em>M</em> iria ser morto, assim por diante, até sobrar uma única pessoa.</p>
<h3>A Solução</h3>
<p>Podemos representar a solução por uma função recursiva, para <em>N par e M = 2</em>:</p>
<p><img class="alignnone size-full wp-image-157" title="Josephus Problem" src="http://felipetonello.com/blog/wp-content/uploads/2009/01/josephus1.png" alt="" width="160" height="21" /></p>
<p>e para N ímpar e <em>M = 2</em>, temos:</p>
<p><img class="alignnone size-full wp-image-158" title="Josephus Problem" src="http://felipetonello.com/blog/wp-content/uploads/2009/01/josephus2.png" alt="" width="194" height="21" /></p>
<p>Não vou postar a solução genérica aqui pois exige uma grande explicação e esse não é o objetivo do post. Você pode ver na <a href="http://en.wikipedia.org/wiki/Josephus_problem">wikipedia</a> ou então comprar o <a href="http://www.amazon.com/Concrete-Mathematics-Foundation-Computer-Science/dp/0201558025">livro</a>, caso queria saber mais.</p>
<p>O interessante é que o algoritmo para solução genérica é bem simples em C++. Usando <a href="http://en.wikipedia.org/wiki/Linked_list">listas ligadas(linked lists)</a> é simples, fácil de entender e super rápido a execução do programa.</p>
<p><strong>Josephus.cpp</strong></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>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
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include &lt;iostream&gt;</span>
<span style="color: #339900;">#include &lt;cstdlib&gt;</span>
&nbsp;
<span style="color: #0000ff;">struct</span> Pessoa <span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">int</span> num<span style="color: #008080;">;</span>
	Pessoa <span style="color: #000040;">*</span>prox<span style="color: #008080;">;</span>
	Pessoa<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> x, Pessoa <span style="color: #000040;">*</span>p<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
		num <span style="color: #000080;">=</span> x<span style="color: #008080;">;</span>
		prox <span style="color: #000080;">=</span> p<span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> argc, <span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span>argv<span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
	<span style="color: #666666;">//'a' recebe primeira pessoa criada</span>
	<span style="color: #666666;">//e 'a' é linkado para si mesmo</span>
	<span style="color: #666666;">//depois 'b' é criado apontado para 'a'</span>
	<span style="color: #0000ff;">int</span> N <span style="color: #000080;">=</span> <span style="color: #0000dd;">atoi</span><span style="color: #008000;">&#40;</span>argv<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span>, M <span style="color: #000080;">=</span> <span style="color: #0000dd;">atoi</span><span style="color: #008000;">&#40;</span>argv<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">2</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	Pessoa <span style="color: #000040;">*</span>a <span style="color: #000080;">=</span> <span style="color: #0000dd;">new</span> Pessoa<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">1</span>, <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	a<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>prox <span style="color: #000080;">=</span> a<span style="color: #008080;">;</span>
	Pessoa <span style="color: #000040;">*</span>b <span style="color: #000080;">=</span> a<span style="color: #008080;">;</span>
&nbsp;
	<span style="color: #666666;">// Aloca na memória todas as pessoas</span>
	<span style="color: #666666;">// e 'b' recebe a última(enésima pessoa)</span>
	<span style="color: #666666;">// pois a contagem começa pela primeira('a')</span>
	<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">2</span><span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;=</span> N<span style="color: #008080;">;</span> <span style="color: #000040;">++</span>i<span style="color: #008000;">&#41;</span>
		b <span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span>b<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>prox <span style="color: #000080;">=</span> <span style="color: #0000dd;">new</span> Pessoa<span style="color: #008000;">&#40;</span>i, a<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
	<span style="color: #666666;">// Loop enquanto 'b' não estiver apontado</span>
	<span style="color: #666666;">// o próximo para ele mesmo</span>
	<span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span>b <span style="color: #000040;">!</span><span style="color: #000080;">=</span> b<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>prox<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
		<span style="color: #666666;">// 'b' recebe a emésima pessoa</span>
		<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;</span> M<span style="color: #008080;">;</span> <span style="color: #000040;">++</span>i<span style="color: #008000;">&#41;</span>
			b <span style="color: #000080;">=</span> b<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>prox<span style="color: #008080;">;</span>
		a <span style="color: #000080;">=</span> b<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>prox<span style="color: #008080;">;</span>
		b<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>prox <span style="color: #000080;">=</span> a<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>prox<span style="color: #008080;">;</span>
		<span style="color: #0000dd;">delete</span> a<span style="color: #008080;">;</span> <span style="color: #666666;">// 'a' é morto =/</span>
	<span style="color: #008000;">&#125;</span>
&nbsp;
	<span style="color: #666666;">// O sobrevivente _o/</span>
	std<span style="color: #008080;">::</span><span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> b<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>num <span style="color: #000080;">&lt;&lt;</span> std<span style="color: #008080;">::</span><span style="color: #007788;">endl</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>Ou então se preferir um link para o <a href="http://pastebin.com/f45d06530">pastebin</a>.</p>
<h3>Analisando o Resultado</h3>
<p>após compilar</p>
<blockquote><p>g++ -o Josephus Josephus.cpp</p></blockquote>
<p>rode o programa com N = 10 e M = 2</p>
<blockquote><p>./Josephus 10 2</p></blockquote>
<p>O valor deu 5? Verifique com a função. Bateu os valores?<br />
Agora vá testando para 1 &lt;= N &lt;= 16 e M = 2.</p>
<blockquote><p>for n in `seq 16`; do echo -n &#8220;$n: &#8220;; ./Josephus $n 2; done</p></blockquote>
<p>Saída do loop:</p>
<blockquote><p>1: 1<br />
2: 1<br />
3: 3<br />
4: 1<br />
5: 3<br />
6: 5<br />
7: 7<br />
8: 1<br />
9: 3<br />
10: 5<br />
11: 7<br />
12: 9<br />
13: 11<br />
14: 13<br />
15: 15<br />
16: 1</p></blockquote>
<p>Perceberam um certo padrão entre as respostas? A função genérica usa justamente esse padrão binário para solução.</p>
<p>Ultimamente eu estou mais dedicado ao estudo de algoritmos, C++, C e Python(é claro). Depois pretendo postar uma analise desse algoritmo passo a passo.</p>
]]></content:encoded>
			<wfw:commentRss>http://felipetonello.com/blog/2009/01/08/josephus-problem-resolvendo-o-de-maneira-simples/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
