Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
打印C中整数数组的所有递减组合_C_Arrays - Fatal编程技术网

打印C中整数数组的所有递减组合

打印C中整数数组的所有递减组合,c,arrays,C,Arrays,我有一个整数数组,我需要打印所有可能的递减组合,它们以最大的数字开始。下面是一个例子: int array[MAX_LEN]={ 5 , 4 , 3 , 2 , 1 } 以及预期产量: 5 , 4 , 3 , 2 , 1 5 , 4 , 3 , 2 5 , 4 , 3 , 1 5 , 4 , 2 , 1 5 , 3 , 2 , 1 5 , 2 , 1 . . 5 , 1 . . 5 有人能给我一个建议怎么做吗?谢谢这个问题可以表示为“对于[4

我有一个整数数组,我需要打印所有可能的递减组合,它们以最大的数字开始。下面是一个例子:

int array[MAX_LEN]={ 5 , 4 , 3 , 2 , 1 }
以及预期产量:

5 , 4 , 3 , 2 , 1  
5 , 4 , 3 , 2   
5 , 4 , 3 , 1  
5 , 4 , 2 , 1  
5 , 3 , 2 , 1  
5 , 2 , 1  
.  
.  
5 , 1  
.  
.  
5  

有人能给我一个建议怎么做吗?谢谢

这个问题可以表示为“对于[4,3,2,1]打印5中的每一个,然后是子序列”

要查找所有子序列,可以按照以下方式执行操作

findAllSubsequences(array) {
    if (array is empty)
        return an empty list

    result = new list

    head = array[0]      // 4
    tail = array[1...]   // [3, 2, 1]

    tailSubsequences = findAllSubsequences(tail)  // recurse on tail

    // Add all subsequences that don't include head
    // [3,2,1] [3,1] [2,1] ...
    result.addAll(tailSubsequences)

    // Add all subsequences that do include head
    // [4,3,2,1] [4,3,1] [4,2,1] ...
    for each subsequence s in tailSubsequences
        result.add(head concatenated with s)

    return result
}

要一次显示n个内容3,可以使用3个索引循环:

    for(i = 0; i < n-3; i++)
        for(j = i+1; j < n-2; j++)
            for(k=j+1; k < n-1; k++)
                // display array[i], array[j], array[k]
(i=0;i 对于(j=i+1;j 为了将其推广到每次为k=1到n个对象显示n个对象(这是外循环),使用迭代(循环非递归)方法,您可以使用索引数组,如ai[n]。然后,对于每次k个对象,您需要用代码替换嵌套循环,这些代码使用k个索引(从ai[0]=0,ai[1]=1,…)完成相同的任务。。。ai[k-1]=k-1。指数的范围将是ai[0]从0到n-k,ai[1]从ai[0]+1到n-k+1,…,ai[k-1]从ai[k-2]+1到n-1。索引像里程表一样先进,ai[k-1]是最低有效数字,ai[0]是最高有效数字

这将为您提供所有的组合。如果需要按降序排列,可以对原始数组排序,也可以对原始数组的副本排序

此类函数的通用名称为“下一个组合”。示例代码:

#include <stdio.h>
#include <malloc.h>

int next_combination(size_t *I, size_t k, size_t n)
{
size_t i, j;
    i = k-1;                            /* find next element to increment */
    while(I[i] == (n-k+i)){
        --i;
        if(i == (size_t)-1){            /* if done, */
            for(i = 0; i < k;  i++)     /*  return initial combination */
                I[i] = i;
            return(0);
        }
    }
    I[i] += 1;                          /* increment element */
    for(j = i+1; j < k; j++)            /* create increasing string */
            I[j] = I[i]+j-i;
    return(1);                          /* return with new combination */
}

int main(int argc, char **argv)
{
int    A[5] = {5, 4, 3, 2, 1};
size_t I[5];
size_t i, k, n;
    n = sizeof(A)/sizeof(A[0]);         /* n things */
    for(k = n; k; k--){                 /* n things k at a time */
        for(i = 0; i < k;  i++)         /* create initial combination */
            I[i] = i;
        do{                             /* display combinations */
            for(i = 0; i < k; i++)
                printf("%2d", A[I[i]]);
            printf("\n");
        }
        while(next_combination(I, k, n));
    }
    return(0);
}
#包括
#包括
整数下一个组合(大小\t*I、大小\t k、大小\t n)
{
尺寸i,j;
i=k-1;/*查找要递增的下一个元素*/
而(I[I]==(n-k+I)){
--一,;
如果(i==(size_t)-1){/*如果完成*/
对于(i=0;i
常见和必要的问题:从一个简单的例子开始:比如{3,2,1}。用手写出符合逻辑的组合。你应该看到一种模式出现。你会意识到你需要两个循环,内部循环的边界取决于外部循环。@Bathsheba,我想说用循环解决这个问题很难。(不能添加n个循环。)必须跟踪索引堆栈。@Bathsheba O(n^2)不正确。我想看看你的证据。因为它不正确,所以没有证据可看;)