Advertisement
Guest User

Gerar Combinacoes Usando Recursao daemoniolabs.wordpress.com

a guest
Sep 29th, 2011
510
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.90 KB | None | 0 0
  1. /*
  2.  * daemoniolabs.wordpress.com
  3.  *
  4.  * Programa que gera combinacoes usando
  5.  * recursao.
  6.  *
  7.  * Pilha de execucao:
  8.  *  comb("", abc)             -> a
  9.  *  |--> comb(a, bc)          -> ab
  10.  *       |--> comb(ab, c)     -> abc
  11.  *           |--> comb(abc, ) -> <nada>
  12.  *       |--> comb(ab,  )     -> <nada>
  13.  *       |--> comb(a,  c)     -> ac
  14.  *            |--> comb(ac, ) -> <nada>
  15.  *  |--> comb("", bc)         -> b
  16.  *       |--> comb(b, c)      -> bc
  17.  *            |--> comb(bc, ) -> <nada>
  18.  *  |--> comb("", c)          -> c
  19.  *       |--> comb(c, )       -> <nada>
  20.  *  |--> comb("", "")         -> <nada> (fim da recursao)
  21.  *
  22.  *  Para entender melhor o algoritmo aconselho anotar
  23.  *  em um papel cada ocorrencia de recursao. Comece
  24.  *  com combinacoes de "ab", depois de "abc", etc.
  25.  *
  26.  * Qui Set 29 17:12:27 BRT 2011
  27.  * */
  28. #include <stdio.h>
  29. #include <stdlib.h>
  30. #include <string.h>
  31.  
  32. void comb(char *prefix1, char *s) {
  33.     /* devemos ter um prefix para cada funcao.
  34.      * Nao podemos usar o parametro porque em C
  35.      * a passagem eh feita por referencia (em
  36.      * java eh por valor) */
  37.     char *prefix = (char *)malloc(strlen(prefix1) + 2);
  38.  
  39.     /* s.length() > 0 */
  40.     if ( strlen(s) > 0 ) {
  41.         int len ;
  42.  
  43.         /* prefix = prefix do parametro. Isso
  44.          * eh necessario pois cada funcao
  45.          * deve ter seu prefix. */
  46.         strcpy(prefix, prefix1) ;
  47.  
  48.         /* prefix + s.charAt(0) */
  49.         len = strlen(prefix) ;
  50.         prefix[len] = s[0] ;
  51.         prefix[len+1] = '\0' ;
  52.  
  53.         /* system.out.println(prefix + s.charAt(0)) */
  54.         printf("%s\n", prefix) ;
  55.  
  56.         /* comb(prefix + s.charAt(0) , s.substring(1)) */
  57.         comb(prefix, s + 1) ;
  58.  
  59.         /* comb(prefix, s.substring(1)) */
  60.         prefix[len]=0;
  61.         comb(prefix, s + 1) ;
  62.  
  63.         free(prefix) ;
  64.     }
  65. }
  66.  
  67. /* funciona igual a comb(), a diferenca
  68.  * eh que o tamanho da combinacao final
  69.  * eh testado com r, se forem iguais,
  70.  * mostra na tela. */
  71. void comb2(char *prefix1, char *s, int r) {
  72.     char *prefix = (char *)malloc(strlen(prefix1) + 2);
  73.  
  74.     if ( strlen(s) > 0 ) {
  75.         int len ;
  76.  
  77.         strcpy(prefix, prefix1) ;
  78.  
  79.         len = strlen(prefix) ;
  80.         prefix[len] = s[0] ;
  81.         prefix[len+1] = '\0' ;
  82.  
  83.         if ( strlen(prefix) == r ) {
  84.             printf("%s\n", prefix) ;
  85.         }
  86.  
  87.         comb2(prefix, s + 1, r) ;
  88.  
  89.         prefix[len]=0;
  90.         comb2(prefix, s + 1, r) ;
  91.  
  92.         free(prefix) ;
  93.     }
  94. }
  95.  
  96. int main() {
  97.  
  98.     /* use para gerar combinacoes de
  99.      * qualquer tamanho. O primeiro parametro
  100.      * deve ser sempre "" e o segundo eh a
  101.      * sequencia de entrada. */
  102.     puts("** Todas as combinacoes de abc **") ;
  103.     comb("", "abc") ;
  104.  
  105.     /* use para gerar combinacoes
  106.      * com r elementos. */
  107.     puts ("** Combinacoes de tamanho 4 **") ;
  108.     comb2("", "123456789", 4) ; /* combinacoes de 4 elementos */
  109.  
  110.     return 0;
  111. }
  112.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement