【问题标题】:Power Set using Recursion使用递归的幂集
【发布时间】:2020-06-11 06:24:59
【问题描述】:
#include <stdio.h>

void powerSet(int* a, int index, int *curr, int N) {
    if (index == N)
        return;

    printf("(");
    for(int i = 0; i <= index; i++)
        printf("%d, ", curr[i]);

    printf(")\n");
    // processing here.


    int x = index + 1;
    for (int i = index + 1; i < N; i++) {

        curr[x]  = a[i];
        // curr += str[i];
        powerSet(a, i, curr, N);
    }
    return;
}

int main(){

    int a[] = {10,12,14,17};
    int *curr = (int*)malloc(sizeof(int) * 50);
    int n = 4;

    powerSet(&(*a),-1,curr,n);
}

上面的代码似乎有一些逻辑错误。有人可以指出来吗? 运行代码时得到的输出如下所示:

() 
(10, )
(10, 12, )
(10, 12, 14, )
(10, 12, 14, 17, )
(10, 12, 17, 17, )
(10, 14, 17, )
(10, 14, 17, 17, )
(10, 17, 17, 17, )
(12, 17, )
(12, 17, 14, )
(12, 17, 14, 17, )
(12, 17, 17, 17, )
(14, 17, 17, )
(14, 17, 17, 17, )
(17, 17, 17, 17, )

【问题讨论】:

  • 在第一个循环中,条件i &lt;= index; 立即为true,因为-1 已传递给index。所以空括号被输出。预期的输出是什么?
  • 不相关,但为什么是int *curr = (int*)malloc(sizeof(int) * 50) 而不是int curr[50]
  • ...我的意思是 false 但我相信你意识到我的意思是循环不会迭代。
  • @Giridhar 请edit您的问题添加请求的信息。请不要将输出描述为“数组的幂集”,而是显示代码中示例数组的输出应该是什么样子。
  • @Bodo:问题包含足够的信息。

标签: c powerset


【解决方案1】:

powerSet(a, i, curr, N); 是错误的。此时,a 的某些元素已添加到 curr 或以前使用过,无论哪种方式,都不再有资格包含在内。调用可以更改为powerSet(a+i+1, x, curr, N-i-1);,因此第一个和第四个参数描述了要考虑的剩余元素(第一个是指向它们开始位置的指针,第四个是它们的数量),第二个和第三个参数描述当前在工作集中的元素(第三个是指向它们开始位置的指针,第二个是最后一个的索引,如果还没有,则为 -1)。

为了使其余代码适应这种变化,删除if (index == N)return;(因为当N为零时我们会知道我们已经完成了,表示没有任何元素需要考虑,最后循环会自然地处理这个问题)并将for (int i = index + 1; i &lt; N; i++)更改为for (int i = 0; i &lt; N; i++)(因此我们循环遍历剩余要考虑的元素,这不涉及index)。

【讨论】:

    猜你喜欢
    • 2021-03-22
    • 1970-01-01
    • 1970-01-01
    • 2011-05-19
    • 2020-09-25
    • 1970-01-01
    • 2015-11-08
    • 1970-01-01
    相关资源
    最近更新 更多