2016-01-20 31 views
-1

我從像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 & & ft_strcpy是一樣的libc中包含的內容。

因此,如果代碼=「ABCD」,那麼這個函數,printf說明了返回的24個組合。 我去了股票的所有回報可能在char **或鏈表中。

  • 有沒有辦法來儲存我所有那些組合?printf
  • 在遞歸函數中使用「while」循環有問題嗎?

這是我項目的最後一個功能之一,非常感謝你,如果你能幫助我!

+1

不要投malloc'和朋友在C.'的sizeof(焦炭)的'結果簡化程序'是* *定義**產生'1'。使用它沒有意義。而'return'是一個陳述,而不是一個f ** u **選項。不要主張表達。 – Olaf

+0

這是的printf的輸出: ABCD ABDC ACDB ACBD ADBC ADCB BCDA BCAD BDAC BDCA BACD BADC CDAB CDBA CABD CADB CBDA CBAD DABC DACB DBCA DBAC DCAB DCBA – jdavin

+0

將一個新變量引入你可以保存printf結果,就像一個大數組。 – jofel

回答

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聲明是一個很好的習慣,而不是遍佈整個身體的多個聲明;這是其中一個原因)。

+0

很好,謝謝,我用printf來看看我想要存儲什麼,當算法會顯示一些結果時,我會自由和一切。 – jdavin

+0

我只需要生成所有可能的N個元素排列,像這樣開始:12345 12354 12453 12435 12534 12543 13542 ...。 – jdavin

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