鱼C论坛

 找回密码
 立即注册
查看: 2333|回复: 5

问:如何用递归求解组合数?

[复制链接]
发表于 2014-7-22 23:16:13 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
给定M个元素,从中选出N个元素。如何用递归的方法将所有的组合情况输出。最好能有详尽 的代码和解释。万分感谢!!!!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2014-7-23 01:24:41 | 显示全部楼层
期待大侠们的指导
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-7-23 08:32:00 | 显示全部楼层
诶~~这个用递归啊 我还真的不会 为什么一定要用递归呢??
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-7-23 09:13:12 | 显示全部楼层

  1. int n = 0;

  2. void swap(char *a, char *b)

  3. {

  4.         char m;

  5.         m = *a;

  6.         *a = *b;

  7.         *b = m;

  8. }

  9. void perm(char list[], int k, int m)

  10. {

  11.         int i;

  12.         if(k > m)

  13.         {

  14.                 for(i = 0; i <= m; i++)

  15.                         printf("%c ", list[i]);

  16.                 printf("\n");

  17.                 n++;

  18.         }

  19.         else

  20.         {

  21.                 for(i = k; i <= m; i++)

  22.                 {

  23.                         swap(&list[k], &list[i]);

  24.                         perm(list, k + 1, m);

  25.                         swap(&list[k], &list[i]);

  26.                 }

  27.         }

  28. }

  29. int main()
  30. {
  31.         char list[] = {'a','b','c', 'd', 'e'};
  32.         perm(list, 0, 4);
  33.         printf("total:%d\n", n);
  34.         system("pause");
  35.         return 0;
  36. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-7-23 18:23:20 | 显示全部楼层

这个貌似是求全排列吧?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-7-25 15:23:02 | 显示全部楼层
#include <stdio.h>
struct Number
{int id;
int num;
struct Number *next;
};

struct Number_1
{struct Number *x1;
struct Number_1 *x2;
};

void numpri(struct Number_1 *head_1)
{struct Number_1 *q1=head_1;
int f;
if(q1!=0)
{
        do
        {f=(*(*q1).x1).num;
        printf("%8d ",f);
        q1=(*q1).x2;
        }while(q1!=0);
        printf("\n");
}
}

void sub(struct Number_1 *head_1,struct Number_1 *p3,int m,int n)
{struct Number_1 *p4,*p5=p3,*p6;
int f;
if(head_1==0){p4=p3;}
else{p4=head_1;}
for(f=m;f>=n;f--)
{
        if(n>1)
        {p5=(struct Number_1 *)malloc(sizeof(struct Number_1));
        (*p5).x1=(*(*p3).x1).next;
        (*p5).x2=0;
        (*p3).x2=p5;
        sub(p4,p5,f-1,n-1);
        (*p3).x1=(*(*p3).x1).next;
        }
        else
        {
                while((*p5).x1!=0)
                {numpri(p4);
                (*p5).x1=(*(*p5).x1).next;
                }
                break;
        }
}
}

void main()
{int m,n;
int i;
struct Number *head,*p1,*p2;
head=0;
p1=(struct Number *)malloc(sizeof(struct Number));
printf("请输入总元素个数M:\n");
scanf("%d",&m);
if(m>0)
{
        head=p1;
        for(i=0;i<m;i++)
        {
                p2=p1;
                (*p2).id=i;
                printf("请输入第%d个元素值:",i);
                scanf("%d",&(*p2).num);
                p1=(struct Number *)malloc(sizeof(struct Number));
                (*p2).next=p1;
        }
        (*p2).next=0;
        printf("输入完毕,请再输入需要从中取出的元素个数:");
        scanf("%d",&n);
        if(n<=m&&n>0)
        {
                struct Number_1 *p3,*head_1=0;
                p3=(struct Number_1 *)malloc(sizeof(struct Number_1));
                (*p3).x1=head;
                (*p3).x2=0;
                sub(head_1,p3,m,n);
        }
        else
        {printf("N值无意义!\n");}
}
else
{printf("M值无意义!\n");}
}
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-10 14:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表