生成重复数字的所有组合

时间:2011-10-27 00:03:59

标签: c recursion

我一直在阅读这个网站足够长的时间,知道不要隐藏这是一个家庭作业。但我正在尝试编写一个代码,可以生成只有0和1的字符串的所有可能组合。如果字符串的长度是n ^ 2,那么将有n 1,其余的将是0。长度总是一个完美的正方形。我在C编码,我一直在尝试在嵌套循环中执行它,但似乎可以以递归方式更容易地完成,我只是不知道如何设置。任何提示或建议将不胜感激。

3 个答案:

答案 0 :(得分:0)

伪代码:

myfun(pos,length, ones)
  if (length==0)
     pos='\0'
     #print, collect, whatever...
     return
  if (length>ones)
    pos='0'
    myfun(pos+1,length-1, ones)
  pos='1'
  myfun(pos+1, length-1, ones-1)

task(n)
  #allocate n^2 buffer
  myfun(buffer, n*n, n)

答案 1 :(得分:0)

我不确定这个问题是否有助于递归。在C(和大多数语言)中,每次调用函数时都会创建一个堆栈帧并使用几个处理器周期和一堆堆栈内存。对此问题的任何递归解决方案都将创建n ^ 2个堆栈帧,即使递归本身只添加一位信息。

下面概述了一个非常糟糕的解决方案。不做的事情:

  • 利用n总是一个完美的正方形。
  • 以非常智能的方式使用内存
  • 释放它使用的任何内存
  • 可能连工作都没有。 ;)

...但它可能会让你了解基本模式。

void foo(int zeros_left, int length_left, char *s)
{
    if (length_left == 0)
        printf("%s\n", s);
    else
    {
        if (zeros_left > 0)
        {
            char *next = malloc(strlen(s) + 2);
            strcpy(next, s);
            strcat(next, "0");
            foo(zeros_left - 1, length_left - 1, next);
        }

        if (zeros_left != length_left)
        {
            char *next = malloc(strlen(s) + 2);
            strcpy(next, s);
            strcat(next, "1");
            foo(zeros_left, length_left - 1, next);
        }
    }
}

答案 2 :(得分:0)

递归建模问题的关键是将问题的更大版本分解为一个简单的计算结合相同问题的较小版本,以及一个终止递归的简单案例。

在这种情况下,问题是:

  • 对于非负M和N,输出所有长度为M且恰好包含N 1的字符串。

你可以将其分解为:

  • 如果M = 0,则输出一个空字符串;否则
  • 输出所有长度为M-1且完全包含N 1s的字符串,每个字符串前缀为0;和
  • 如果N > 0,则输出所有长度为M-1且完全包含N-1 1s的字符串,并在每个字符串前面添加1。

这里,M = 0是终止递归的简单案例。将上述内容转换为代码非常简单。