introducao_recursividade_binarios.html 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. <!--
  2. Introdução à Programação - 2017 - Prof. Leoônidas de Oliveira Brandão
  3. Introdução à recorrência/recursividade em algoritmos: gerar todos os binários
  4. LInE (Laboratory of Informatics in Education) - http://www.usp.br/line
  5. IME - USP
  6. Material didático
  7. Pode usar livrevemente este material para fins não comerciais, devendo sempre fazer referência à autoria.
  8. Sugestões/apontamento são bem vindos: leo@ime.usp.br (favor indicar no assunto "material de introducao 'a programacao")
  9. Prof. Leônidas de Oliveira Brandão
  10. http://www.ime.usp.br/~leo
  11. http://line.ime.usp.br
  12. http://www.matemtica.br
  13. -->
  14. <meta http-equiv='Content-Type' content='text/html; charset=UTF-8'>
  15. <meta name='keywords' content='mac0122, material, professores, leonidas de oliveira brandao'>
  16. <link rel='stylesheet' type='text/css' href='css_img_js_conf/all.css'>
  17. <link rel='stylesheet' type='text/css' href='css_img_js_conf/line_introducao_programacao.css'>
  18. <script src="css_img_js_conf/defineLInE.js"></script> <!-- para referencias 'a documentos internos -->
  19. <div class="pagina">
  20. <p class="secao">Introdução à recorrência/recursividade em algoritmos: gerar todos os binários</p>
  21. <center><p>[
  22. <a href="introducao_recursividade.html#binarios" title="Apresentando recursividade e o problema">Inicio</a> &nbsp; | &nbsp;
  23. <a href="#forma" title="Ideia de recursividade">Estrutura</a> &nbsp; | &nbsp;
  24. <a href="#aplicando" title="nao fazer Fibonacci recursivo">Resolvendo</a> &nbsp;
  25. ]</p>
  26. </center>
  27. <p>
  28. Nesta seção apresentamos as ideias de como resolver um problema de forma recursiva, em particular ilustrando isso
  29. para resolver o seguinte problema:
  30. <i>como gerar todos os números binários com exatamente <i>k</i> <i>bits</i> (considerandos os "zeros à esquerda")?</i>.
  31. </p>
  32. <a name="forma"><span style="color: #0050A0">Estrutura de um problema a ser resolvido recursivamente</span></a>
  33. <p>
  34. Para que o problema seja natualmente resolvido por um algoritmo recursivo é preciso que ele seja facilmente
  35. quebrável em sub-problemas menores (denominamos esta técnica de resolução por <b>divisão e conquista</b>)
  36. e que depois as soluções dos problemas menores possam ser utilizadas para resolver o problema original.
  37. </p>
  38. <p>
  39. O problema da geração dos binãrios com até <i>k</i> dígitos apresenta esta característica.
  40. <ol>
  41. <li>(<b>divisão</b>) Podemos quebrá-lo da seguinte forma:
  42. resolver para <i>k</i> dígitos pode ser feito resolvendo primeiro para <i>k-1</i> dígitos (nesse caso a quebra é "linear").
  43. </li>
  44. <li>(<b>conquista</b>) Uma vez encontrada a solução <tt>(l1, ..., lk)</tt> para <i>k-1</i> dígitos, a solução para <i>k</i> dígitos é simplesmente
  45. <tt>("0"+l1, ..., "0"+lk, "1"+l1, ..., "1"+lk)</tt> (indicando por "+' o operador de concatenação).
  46. </li>
  47. </ol>
  48. </p>
  49. <p>
  50. A construção da solução recursiva para resolver o problema seria então aplicar a recorrência para cada um dos sub-problemas e
  51. depois usar os resoltados devolvidos para compor a <b>solução global</b>.
  52. </p>
  53. <a name="aplicando"><span style="color: #0050A0">Resolvendo a geração ordenada de todos os números binário com até <i>k</i> dígitos</span></a>
  54. <p>
  55. Desse modo, para tentar resolver um problema recursivamente, deve-se primeiro imaginar como quebrar o problema, então fazer um raciocínio
  56. de como reagrupar as soluções parciais para formar a solução global.
  57. </p>
  58. <p>
  59. Para o problema considerado claramente a quebra poderia ser feita no número de dígitos.
  60. Se desejamos gerar os binários com <i>k</i> dígitos, supnhamos então que alguém resolveu o problema com <i>k-1</i> dígitos.
  61. Bem, se a solução para <i>k-1</i> dígitos é a lista <tt>(0...0, 0...1, ..., 1...0, 1...1)</tt>, então a solução global seria
  62. duplicar a lista dada, sendo que para cada uma das cópias adicionamos o dígito "0" à frente e na outra o dígito "1", ou seja, a solução seria
  63. a lista seguinte
  64. <center><pre>00...0, 00...1, ..., 01...0, 01...1
  65. 10...0, 10...1, ..., 11...0, 11...1</pre></center>
  66. </p>
  67. <p>
  68. Claro que um caso trivial, seria quando <i>k=1</i>, pois nesse caso <i>k-1=0</i> resultando em uma lista vazia.
  69. Portanto a solução global seria apenas os números "0" e "1" (eles concatenados com sequência vazia resultari neles próprios).
  70. E essa poderia ser a condição de terminação a recorrência: <tt>se k=0, devolver &lt;vazio&gt;</tt>.
  71. </p>
  72. <p>
  73. Assim, vamos esquematizar o algoritmo refletindo precisamente essa ideia
  74. <center><table><tr><td><pre>gerar_binario (vet, n, k) {
  75. se (k==n) { <cyan>// ja' gerou o ultimo bit =&lt; imprima e volte</cyan>
  76. imprima(vet, n);
  77. devolver; <cyan>// funcao e' vazia</cyan>
  78. }
  79. vet[k] = 0; <cyan>// define o k com '0'</cyan>
  80. gera_binario(vet,n,k+1); <cyan>// indutivamente, gera os proximos bits (de k+1 ate' n-1)</cyan>
  81. vet[k] = 1; <cyan>// altera o k</cyan>
  82. gera_binario(vet,n,k+1); <cyan>// idem</cyan>
  83. }</pre></td></tr></table></center>
  84. </p>
  85. <p>
  86. Simule o algoritmo acima e veja que para <i>k=4</i> ele consegue construir a os 15 valores abaixo, na ordem correta.
  87. </p>
  88. <p>
  89. <center><pre>Decimal Binário | Decimal Binário
  90. 0 0000 | 8 1000
  91. 1 0001 | 9 1001
  92. 2 0010 | 10 1010
  93. 3 0011 | 11 1011
  94. 4 0100 | 12 1100
  95. 5 0101 | 13 1101
  96. 6 0110 | 14 1110
  97. 7 0111 | 15 1111</pre><i>Exemplo: todos os binários com até 4 dígitos (com seu correspondente decimal à esquerda)</i>
  98. </center>
  99. </p>
  100. <p>
  101. <a href="https://www.ime.usp.br/~leo" target="_blank" title="seguir para a pagina do prof. Leônidas">Leônidas de Oliveira Brandão</a><br/>
  102. <a href="http://www.ime.usp.br/~leo" target="_blank" title="seguir para a página do LInE">http://line.ime.usp.br</a>
  103. </p>
  104. <p class="rodape">
  105. <b>Alterações</b>:<br/>
  106. 2020/08/20: acetos no formato, mais detalhes no gera_binario;<br/>
  107. 2020/08/15: novo formato, pequenas revisões;<br/>
  108. 2018/06/18: primeira versão
  109. </p>
  110. </p>
  111. </div>
  112. </p>