我正在努力从像 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("%sn", 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);
}
伊尼被这个人称为:
char *combi_mix(char *code)
{
combi_switch(code, 0);
return (NULL);
}
ft_strlen&&ft_strcpy与libc包含相同。
因此,如果代码 = "ABCD",则使用此函数printf
说明返回的 24 种组合。我去库存所有回报,可能在一个字符**或链表中。
- 有没有办法储存我
printf
的所有组合? - 在递归函数中使用"while"循环是否有问题?
这是我项目的最后一个功能之一,所以如果你能帮助我,非常感谢你!
不,任何类型的函数中的任何类型的控件构造都没有任何特殊问题。使用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
语句,而不是分散在整个正文中的多个语句;这是其中一个原因)。
您可以使用以下逻辑简化程序
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("%sn",str);
j++;
k++;
}
有关更多信息,您可以在此处查看