用递归方法求集合的子集

用递归的方法求一个集合的子集。

实现代码如下:
#include   <stdio.h>   
  #include   <stdlib.h>   
  #include   <string.h>   
    
    
  #define   N   20   
  int   used[N];   
    
  void   output(char   *str);   
  int   diver(char   *str,   int   len,   int   index);   
    
  int   main(   void   )   
  {   
  char     input[20];   
  int   len;   
    
  printf("Please   enter   a   string:");   
  while(fgets(input,   20,   stdin)   ==   NULL   ||   input[0]   ==   '/n')   
          {   
  printf("Input   error!/n");   
  printf("Please   enter   a   string   again:");   
    
          }   
  input[strlen(input)   -   1]   =   '/0';     
  len   =   strlen(input);   
  diver(input,   len,0);   
        
  return   0;   
  }   
    
  int   diver(char   *str,   int   len,   int   index)   
  {   
  if(index   >=   len)   
  output(str);   
  else   
  {   
  used[index]   =   1;   
  diver(str,   len,   index   +   1);   
  used[index]   =   0;   
  diver(str,   len,   index   +   1);   
    
  }   
    
  return   0;   
  }   
    
  void   output(char   *str)   
  {   
        int   i;   
    
        printf("{");   
        for(i   =   0;i   <   N;   i++)   
        if(used[i])   
        printf("%c",str[i]);   
  printf("}");   
        printf("/n");   
  }
原理如下图所示:
以123为例,求他的子集。
实际上转化为二叉树结构,每一个节点都有两种状态,1和0。
1表示该数有效可以输出,否则无效,不输出。这个二叉树的最底层叶子节点就是求出的所有子集的结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值