uflyjz 2021-07-18 18:52 采纳率: 83.3%
浏览 49
已结题

打印前n个自然数选r个的所有组合。

递归。书上留了个“请读者自己完成”,想了半天不会。

思路:

从1到n循环,

1.取第i个

2.在i+1后的数中取r-1个

3.合并1、2步中所取数字,得到一种组合


第一次尝试(3选2测试):

#include <stdio.h>

void combination(int s, int j); //从s到n里选j个数打印出来

int n, r;

int main(void)
{
    n = 3;
    r = 2;
    combination(1, r);
    return 0;
}

void combination(int s, int j)
{
    for (int i = s; i <= n - j + 1; i++)
    {
        printf("%4d", i);
        if (j > 1)
        {
            combination(i + 1, j - 1);
        }
        else
            printf("\n");
    }
}

输出:

   1   2
   3
   2   3

错误原因:打完1之后,开始进行combination(2,1),这个函数只会打印出2、3,从而3并未和1进行合并。

解决方案:

1,(书上给出了具体方法)使用全局数组变量存储每层的i

#include <stdio.h>

void combination(int s, int j); //从s到n里选j个数打印出来

int n, r;
int arr_i[20];

int main(void)
{
    n = 5;
    r = 3;
    combination(1, r);
    return 0;
}

void combination(int s, int j)
{
    for (int i = s; i <= n - j + 1; i++)
    {
        arr_i[r - j] = i; //r-j就是i所在的层数。可理解为选出了第i个数,但还要接着选,尚未合并打印
        if (j > 1)
        {
            combination(i + 1, j - 1);
        }
        else //递归出口,若只需寻找一个数就不用再深一层了,打印出选出来的所有数即可
        {
            for (int k = 0; k < r; k++)
                printf("%4d", arr_i[k]);
            printf("\n");
        }
    }
}

2,在每层递归时打印本层i。书上没给答案,我想不出来。

  • 写回答

1条回答 默认 最新

  • 醉酒梦天下 2021-07-19 20:05
    关注
    #include<iostream> 
    using namespace std; 
    int sum[100]; 
    void function(int m,int k) 
    { 
        int i,j; 
        for(i=m;i>=k;i--) 
        { 
            a[k]=i; 
            if(k>1) 
                function(i-1,k-1); 
            else 
            { 
                for(j=a[0];j>0;j--) 
                    cout<<a[j]<<"\t"; 
                cout<<endl; 
            } 
        } 
    } 
      
      
    int main() 
    { 
        int n,r; 
        cout<<"请输入n和r的值:"<<endl; 
        cin>>n>>r; 
        if(r>n) 
            cout<<"输入n和r的值错误!"<<endl; 
        else 
        { 
            a[0]=r; 
            function(n,r); 
        } 
        return 0; 
    } 
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 3月10日
  • 已采纳回答 3月2日
  • 修改了问题 8月8日
  • 创建了问题 7月18日

悬赏问题

  • ¥15 对于这个复杂问题的解释说明
  • ¥50 三种调度算法报错 有实例
  • ¥15 关于#python#的问题,请各位专家解答!
  • ¥200 询问:python实现大地主题正反算的程序设计,有偿
  • ¥15 smptlib使用465端口发送邮件失败
  • ¥200 总是报错,能帮助用python实现程序实现高斯正反算吗?有偿
  • ¥15 对于squad数据集的基于bert模型的微调
  • ¥15 为什么我运行这个网络会出现以下报错?CRNN神经网络
  • ¥20 steam下载游戏占用内存
  • ¥15 CST保存项目时失败