2011-03-13 66 views
0

你好,我需要知道是否有可能做這樣的遞歸,以及如何? 我希望能夠選擇我想要的循環數,例如GenerateNumbers(x)其中x是我內部的循環數。循環遞歸(生成數據)

int a, b, c; 
for (a = 0; a < 10; a++) 
{ 
    printf("\n%d", a); 
    for (b = 0; b < 10; b++) 
    { 
     printf("\n%d%d", a, b); 
     for (c = 0; c < 10; c++) 
     { 
      printf("\n%d%d%d", a, b, c); 
     } 
    } 
} 
+0

這是不可能的代碼,但它應該可能與遞歸,因爲每個調用都會產生一個新的循環。 – 2011-03-13 19:45:29

回答

1
#include <stdio.h> 
#include <stdlib.h> 



int GenerateNumbersHelper(int depth,int max_depth,int* data) 
{ 
    int i; 
    if(depth == 1 + max_depth) 
     return 0; 

    for(i=0;i<depth;i++) 
    { 
     printf("%i",data[i]); 
    } 
    printf("\n"); 
    for(i=0;i<10;i++) 
    { 
     data[depth]=i; 
     GenerateNumbersHelper(depth+1,max_depth,data); 
    } 
    return 0; 
} 

int GenerateNumbers(int depth) 
{ 
    int* data; 
    data = malloc(sizeof(int)*depth); 
    GenerateNumbersHelper(0,depth,data); 
    free(data); 
} 

int main(void) 
{ 
    GenerateNumbers(3); 
} 
0

確實有可能。如果x上有一個上限,則需要使用堆棧結構或至少一個數組。

+0

當然,堆棧結構可以是調用堆棧本身(通過遞歸函數調用)。 – 2011-03-13 19:48:15

+0

不,它不能,因爲前面調用的數據需要在他的情況下被訪問(例如OP示例中的最後一個printf使用全部三個循環迭代器)。除非你正在編寫一些基於ASM的惡意攻擊來訪問調用堆棧。你也可以用可變參數來做。 – 2011-03-13 19:50:29

+0

@E.Benoît:您可以將參數傳遞給函數調用,不是嗎?我沒有說它會是一個很好的功能,但如果不可能,我會感到驚訝。 – 2011-03-13 19:51:25

1

像這樣的東西?

void PrintCombinations(unsigned int CombinationLength) 
{ 
    int * state = calloc(CombinationLength, sizeof(*state)); 
    Recurse(state, CombinationLength, CombinationLength); 
    free(state); 
} 

void Recurse(int State[], size_t StateSize, unsigned int Depth) 
{ 
    if(Depth) 
    { 
     for(State[Depth-1]=0; State[Depth-1]<10; State[Depth-1]++) 
      Recurse(State, StateSize, Depth-1); 
    } 
    else 
    { 
     putchar('\n'); 
     for(;StateSize; StateSize--) 
      printf("%d",State[StateSize-1]); 
    } 
} 

(注:這是Ç代碼,因爲你在你的實施例中使用printf;如果它是C++的狀態陣列將具有C++ 0x中被包裹在一個智能指針像std::auto_ptrstd::unique_ptr

請注意,您也可以通過迭代模擬這種遞歸,例如參見this other answer of mine