| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2019 人关注过本帖
标题:一道简单的题,估计是思路有问题
只看楼主 加入收藏
mfkblue
Rank: 5Rank: 5
等 级:职业侠客
帖 子:472
专家分:343
注 册:2008-12-21
结帖率:96.25%
收藏
已结贴  问题点数:20 回复次数:37 
一道简单的题,估计是思路有问题
编写一个递归函数,用来输出n个元素的所有子集.例如,三个元素{a,b,c}的所有子集是:
{}(空集),{a},{b},{c},{ab},{ac},{bc},{abc}.
看来看去自己的代码,不是思路有问题,而是很有问题。来请教下个各位大哥咋写.
#include <iostream.h>
#include <stdlib.h>
void sub(char list[],int n)
{
    if(n==0)
    {
        cout<<" ";
        exit(1);
    }
    else
    {
        for(int i=0;i<n;i++)
        {
        cout<<list[i];
        
        }
    }
}


void main()
{
    char list[]="abc";//按题意这里是不定的,我这拿来测试用的.
    sub(list,3);
}
搜索更多相关主题的帖子: 思路 
2009-07-21 23:32
realfree
Rank: 2
等 级:论坛游民
帖 子:11
专家分:22
注 册:2009-6-20
收藏
得分:0 
你这个思路基本上是完全错误的,而且这貌似也不是一道特别简单的题

[[it] 本帖最后由 realfree 于 2009-7-22 14:24 编辑 [/it]]
2009-07-22 14:22
mfkblue
Rank: 5Rank: 5
等 级:职业侠客
帖 子:472
专家分:343
注 册:2008-12-21
收藏
得分:0 
基本上是照书抄的。跟着代码在纸上画了下,第一次输是abc不错,第二次输出时,k=0;i=1, 交换后list="bac" 所以输出时应该也是bac,但实际运行不是的,这题真难懂。
#include <iostream.h>
#include <stdlib.h>
inline swap(char &a,char &b)
{
char t=a;
a=b;
b=t;
}

void sub(char list[],int k,int m)
{
    int i;
    if(k==m)
    {
        for(i=0;i<=m;i++)
            cout<<list[i];
        cout<<endl;
    }
    else
    {
        for(i=k;i<=m;i++)
        {
        swap(list[k],list[i]);
        sub(list,k+1,m);
        swap(list[k],list[i]);
        }
    }
}


void main()
{
    char list[]="abc";
    sub(list,0,3);
}
2009-07-22 16:46
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
回复 3楼 mfkblue
嗯,我也觉得不是一道很简单的题。呵呵~
2009-07-22 21:26
mfkblue
Rank: 5Rank: 5
等 级:职业侠客
帖 子:472
专家分:343
注 册:2008-12-21
收藏
得分:0 
大家都说看完c和c++的基础后要看看数据结构,这就是数据结构的算法应用第一章的题目。
2009-07-22 22:45
leeco
Rank: 4
等 级:贵宾
威 望:10
帖 子:1029
专家分:177
注 册:2007-5-10
收藏
得分:10 
程序代码:

char a[]="abcd";

const int n=sizeof(a)-1;
int x[sizeof(a)];

void dfs(int d)
{
    putchar('{');
    for(int i=0;i<d;i++)
    {
        putchar(a[x[i]]);
    }
    putchar('}');
    putchar('\n');
    if(d==n) return ;
    for(int i=(d?x[d-1]+1:0);i<n;i++)
    {
        x[d]=i;
        dfs(d+1);
    }
}

int main()
{
    dfs(0);   
}

2009-07-22 22:57
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
回复 6楼 leeco
嗯,漂亮

我昨天晚上了也想了半天这题。想到的方法和你有点像,但我用的是循环不是递归,不太符合题目要求。但是可以按楼主说的顺序输出。不过现在还没写好~ 嘿嘿,我有空再试试,可能没你的方法好~
2009-07-23 11:23
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:10 
回复 7楼 pangding
写好了~
程序代码:
#include <stdio.h>

#define N 5
char s[N] = { 'a', 'b', 'c', 'd', 'e' };
int index[N];

void __put(int k)  // 辅助函数,用于输出形如“{***}”的格式。
{
    putchar('{');
    for (int i = 0; i < k; i++)
        putchar(s[index[i]]);
    putchar('}'); putchar('\n');
}
bool __inc(int n, int k)  // 辅助函数。用于sub_aux。计算不重复的脚标。
{
    int j = k - 1;
    if (++index[j] < n) return true;

    while (j > 0) {
        --j, --n;
        if (++index[j] < n) {
            while (++j < k)
                index[j] = index[j-1] + 1;
            return true;
        }
    }
    return false;
}

void sub_aux(int n, int k)  // 这个函数的是,把一个 含有n个元素的集合的 所有 含有元素个数为k的子集 输出。
{
    for (int i = 0; i < k; i++)
        index[i] = i;
    do {
        __put(k);
    } while(__inc(n, k));
}
    
void sub(int n)
{
    puts("{}");    // 先输出空集。
    for (int i = 1; i <= n; i++)
        sub_aux(n, i);   // 输出n元集的i元子集。
}

int main()
{
    sub(N);

    return 0;
}

嘿嘿,再加点注释,我这个編的不好,算法没有Le同学的清楚~

[[it] 本帖最后由 pangding 于 2009-7-23 12:06 编辑 [/it]]
2009-07-23 11:59
ET_bug
Rank: 7Rank: 7Rank: 7
来 自:广东
等 级:黑侠
帖 子:89
专家分:602
注 册:2009-7-21
收藏
得分:0 
leeco同学的代码很高效,短小精悍,值得学习呀!!!
当然pangding版主自强不息,致力原创,也是精神可嘉!!嘿嘿

编程之路无止境!
可是小子才入门!
2009-07-23 12:21
ET_bug
Rank: 7Rank: 7Rank: 7
来 自:广东
等 级:黑侠
帖 子:89
专家分:602
注 册:2009-7-21
收藏
得分:0 
呃。。发错图片了!!应该是才对

编程之路无止境!
可是小子才入门!
2009-07-23 12:23
快速回复:一道简单的题,估计是思路有问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.035252 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved