美文网首页
从数组中取出n个元素的所有组合(递归实现)

从数组中取出n个元素的所有组合(递归实现)

作者: 123_4567_8910 | 来源:发表于2016-08-24 11:33 被阅读279次

从小到大排序

1.用OC外层封装的方法
-(NSArray *)combine:(NSArray * )array count:(NSInteger)count{
    int arr[array.count];
    for (int i = 0; i < array.count; i++)
    {
        arr[i] = [array[i] intValue];
    }
    int num = count;
    int result[num];
    
    return combine_increase(arr, 0, result, num, num, sizeof(arr)/sizeof(int));
}
2.用C语言和OC混编实现的方法,直接把结果返回
//arr为原始数组
//start为遍历起始位置
//result保存结果,为一维数组
//count为result数组的索引值,起辅助作用
//NUM为要选取的元素个数
//arr_len为原始数组的长度,为定值
NSArray * combine_increase(int* arr, int start, int* result, int count, const int NUM, const int arr_len)
{
    NSMutableArray * resultArr = [NSMutableArray array];
    int i = 0;
    for (i = start; i < arr_len + 1 - count; i++)
    {
        result[count - 1] = i;
        if (count - 1 == 0)
        {
            int j;
            NSMutableArray * subArr = [[NSMutableArray alloc]init];
            for (j = NUM - 1; j >= 0; j--){
                [subArr addObject:[NSNumber numberWithInt:arr[result[j]]]];
//                printf("%d\t",arr[result[j]]);
            }
            [resultArr addObject:subArr];
//            printf("\n");
        }
        else
         [resultArr addObjectsFromArray:combine_increase(arr, i + 1, result, count - 1, NUM, arr_len)];
    }
    return resultArr;
}
3.纯C语言实现
//arr为原始数组
//start为遍历起始位置
//result保存结果,为一维数组
//count为result数组的索引值,起辅助作用
//NUM为要选取的元素个数
//arr_len为原始数组的长度,为定值
void combine_increase(int* arr, int start, int* result, int count, const int NUM, const int arr_len)
{
    int i = 0;
    for (i = start; i < arr_len + 1 - count; i++)
    {
        result[count - 1] = i;
        if (count - 1 == 0)
        {
            int j;
            for (j = NUM - 1; j >= 0; j--)
                printf("%d\t",arr[result[j]]);
            printf("\n");
        }
        else
            combine_increase(arr, i + 1, result, count - 1, NUM, arr_len);
    }
}

从大到小排序

1.用OC外层封装的方法
-(NSArray *)combine2:(NSArray * )array count:(int)count{
    int arr[array.count];
    int i;
    for (i = 0; i < array.count; i++)
    {
        arr[i] = [array[i] intValue];
    }
    int result[count];
    
    return combine_decrease(arr,i, result, count, count);
}
2.用C语言和OC混编实现的方法,直接把结果返回
//arr为原始数组
//start为遍历起始位置
//result保存结果,为一维数组
//count为result数组的索引值,起辅助作用
//NUM为要选取的元素个数
NSArray * combine_decrease(int* arr, int start, int* result, int count, const int NUM)
{
    NSMutableArray * resultArr = [NSMutableArray array];
    int i;
    for (i = start; i >=count; i--)
    {
        result[count - 1] = i - 1;
        if (count > 1)
        {
            [resultArr addObjectsFromArray:combine_decrease(arr, i - 1, result, count - 1, NUM)];
        }
        else
        {
            int j;
            NSMutableArray * subArr = [[NSMutableArray alloc]init];
            for (j = NUM - 1; j >=0; j--){
                [subArr addObject:[NSNumber numberWithInt:arr[result[j]]]];
//                printf("%d\t",arr[result[j]]);
            }
            [resultArr addObject:subArr];
//            printf("\n");
        }
    }
    return resultArr;
}
3.纯C语言实现
//arr为原始数组
//start为遍历起始位置
//result保存结果,为一维数组
//count为result数组的索引值,起辅助作用
//NUM为要选取的元素个数
void combine_decrease(int* arr, int start, int* result, int count, const int NUM)
{
  int i;
  for (i = start; i >=count; i--)
  {
    result[count - 1] = i - 1;
    if (count > 1)
    {
      combine_decrease(arr, i - 1, result, count - 1, NUM);
    }
    else
    {
      int j;
      for (j = NUM - 1; j >=0; j--)
    printf("%d\t",arr[result[j]]);
      printf("\n");
    }
  }
}

相关文章

  • 从数组中取出n个元素的所有组合(递归实现)

    从小到大排序 1.用OC外层封装的方法 2.用C语言和OC混编实现的方法,直接把结果返回 3.纯C语言实现 从大到...

  • 组合数算法

    一、概念 什么是组合数呢? 从m个不同元素中取出n(n≤m)个元素的所有组合的个数,叫做从m个不同元素中取出n个元...

  • R统计:排列组合

    导读 排列数:从n个不同元素中取出m(m≤n)个元素的所有不同排列的个数。组合数:从n个不同元素中取出m(m≤n)...

  • 排列组合

    排列组合计算公式如下: 1、从n个不同元素中取出m(m≤n)个元素的所有排列的个数,叫做从n个不同元素中取出m个元...

  • What is the Julia function to co

    从n个元素中取出k个的组合数量: 具体的组合明细:

  • 无序排列组合的计算

    n个数中取出m个的组合数( 例如:从1,2,3,4随机取出2个数,一共有6种) 2.表示从n个元素中取出m个元素的...

  • 小朋友学奥数(12):组合

    一、定义 从n个不同的元素中,任取m(m≤n)个元素为一组,叫作从n个不同元素中取出m个元素的一个组合。 二、例题...

  • 动态规划入门03

    从递归转换到动态规划 如果一个递归函数有n个参数,那就定义一个n维数组,数组的下标就是递归函数的取值范围,数组元素...

  • 取球问题

    从N个不同的球中取出M个,求有多少种取法。 问题分析 这里显然可以通过数组合公式求出答案,但这里笔者讲一下递归的版...

  • 排列组合--原理及实现

    1. 定义: 组合数:从m个不同元素中任取n(n<=m)个元素拼成一组,叫做从m中取n个元素的组合。能够取的所有可...

网友评论

      本文标题:从数组中取出n个元素的所有组合(递归实现)

      本文链接:https://www.haomeiwen.com/subject/yhznsttx.html