打印非连续的方式的打印方式

时间:2015-10-12 16:17:13

标签: python c algorithm recursion

给定正整数N,打印1到2 ^ N之间的所有整数,使其二进制表示中没有连续的1。

我有以下代码,但有时打印重复。是否可以不重复打印?

#include <stdio.h>

int a[100];
void foo(int i, int size)
{
    if (i >= size) {
        int i;
        for (i=0;i<size;i++)
            printf("%d\n", a[i]);
        printf("----\n");
        return;
    }

    if (a[i-1] == 1 || a[i-1] == 0)
        a[i] = 0;
    foo(i+1, size);
    if (a[i-1] == 0)
        a[i] = 1;   
    foo(i+1, size);
}

int main(void) {
    int i = 0;
    int size = 5;
    a[i] = 1;
    foo(1, size);
    return 0;
}

我有这个http://ideone.com/cT4Hco python程序,它使用哈希映射来打印元素,但我认为我们也可以在没有哈希映射的情况下执行此操作。

1 个答案:

答案 0 :(得分:3)

几个笔记:

  • 您不应该从索引1开始回溯。而是从0开始,因为您的数字将在数组[0, n-1]中的a范围内
  • 您不应将a[0]初始化为1,因为a[0] = 0也是有效案例。
  • if (a[i-1] == 1 || a[i-1] == 0)是多余的

代码:

#include <stdio.h>

int a[100];
void foo(int i, int size)
{
    if (i >= size) {
        int i;
        for (i=0;i<size;i++)
            printf("%d ", a[i]);
        printf("\n----\n");
        return;
    }

    a[i] = 0;
    foo(i+1, size);
    if ( i == 0 || a[i-1] == 0) {
        a[i] = 1;
        foo(i+1, size);
    }
}

int main(void) {
    int i = 0;
    int size = 5;
    foo(0, size);
    return 0;
}

您可能还希望在打印过程中过滤解决方案0 0 0 ... 0,因为您只需要12^n的数字。如果包含2^n,您还应该打印它。回溯考虑数字0, ...., 2^n-1