如何从递归函数中存储多个返回值

时间:2016-01-20 15:12:22

标签: c recursion

我正在努力从像ABCD这样的代码生成所有组合,例如24个组合1 * 2 * 3 * 4.

我有这个功能:

static char     *combi_switch(char *code, int i)
{
    char        *combi;
    int         j;
    int         k;
    int         l;
    int         s;

    combi = (char *)malloc(sizeof(char) * ft_strlen(code) + 1);
    ft_strcpy(combi, code);
    k = i;
    l = i;
    j = ft_strlen(code) - 1;
    if (i == j)
    {
        printf("%s\n", combi);
        return (combi);
    }
    while (l <= j)
    {
        s = combi[i];
        combi_switch(map, combi, k + 1, stock);
        while (i < j)
        {
            combi[i] = combi[i + 1];
            i++;
        }
        i = k;
        combi[j] = s;
        l++;
    }
free(combi);
return (NULL);
}

ini被这个人打电话:

char            *combi_mix(char *code)
{
    combi_switch(code, 0);  
    return (NULL);
}

ft_strlen&amp;&amp; ft_strcpy与libc包含的相同。

因此,如果代码=“ABCD”,使用此函数,printf说明了返回的24种组合。 我把所有的回报都归还给了char **或链表。

  • 有没有办法存储我printf的所有组合?
  • 在递归函数中使用“while”循环是否有问题?

这是我项目的最后一项功能,所以非常感谢你,如果你能帮助我的话!

2 个答案:

答案 0 :(得分:1)

不,在任何类型的功能中,任何类型的控制构造都没有任何特殊问题。使用while或其他。现在,一旦我们将其从系统中解脱出来,让我们专注于这个重要的问题。如何累积函数的结果而不是打印它们?函数实际计算的内容并不重要,它的递归和每个调用都会打印一些内容,这一点非常重要。我们想收集而不是打印。

首先,函数应该返回一些东西。您当前的函数返回char*但它从未使用过。您的新函数应返回您所追求的值,即集合

typedef struct {
   /* whatever */
} string_collection;

我们没有指定集合内部的内容。它可能是链表,也可能是动态数组及其长度等等。你决定你想要什么样的收藏。

现在你需要一些功能:

string_collection* create_empty_collection();
void add_element (string_collection* c, const char* s);
void move_elements (string_collection* c1, 
                    string_collection* c2); // moves all elements from c2 to c1, leaving c2 empty
void destroy_collection (string_collection* c);

这些函数修改了它们的参数。这些只是示例签名。如果您愿意,可以使用完全不可变的界面:

string_collection* add_element (const string_collection* c, const char* s); 
string_collection* concatenate (const string_collection* c1, 
                                const string_collection* c2); //etc

在此变体中,您可以创建全新的集合而无需触及现有集合。每种风格都有它的位置;使用适合你的任何东西。

现在修改功能很简单:

string_collection* your_function (whatever parameters) 
{
   // First, need a collection to return
   string_collection* coll = create_empty_collection();

   // whatever 
   // whatever

   // ATTN: old code was: printf ("%s", something), now do this:
   add_elememt (coll, something); 

   // whatever 
   // whatever

   // ATTN: old code was: your_function(whatever parameters), now do this:
   string_collection* new_coll = your_function(whatever parameters);
   move_elements (coll, new_coll);
   destroy_collection (new_coll);

   // whatever 
   // whatever

   // ATTN: old code was: return something, now do this:
   return coll;
}

当你打电话给你的功能时,你现在可以:

string_collection* coll = your_function (whatever parameters)'
// do something with the collection
destroy_collection (coll);

这里我们刚学会累积递归函数结果。真棒!

在相关的说明中,您的函数malloc每次被调用时都会输入一个字符串,但看不到free。这很糟糕(内存泄漏)。请添加

free (combi);

在适当的地方。在您的情况下,这意味着在任何return语句之前。 (在函数末尾有一个return语句,而不是分散在整个正文中的多个语句,这是一个很好的做法;这是其中一个原因。)

答案 1 :(得分:0)

您可以使用以下逻辑简化程序

char str[]="ABCD";
     int i,j,k,l,count=0;
     char temp;
      l=strlen(str);
      j=0;
      k=1;
      for(i=0;i<factorial(l);i++)
       {
        if(j==l)
         {
          j=0;
         }
        if(k==l)
         {
          k=0;
         }
        temp=str[j];
        str[j]=str[k];
        str[k]=temp;
        printf("%s\n",str);
        j++;
        k++;
       }

了解更多信息,see here