带循环的递归(生成数据)

发布于 2024-10-21 10:27:45 字数 369 浏览 1 评论 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);
        }
    }
}

Hello I need to know if it is possible to do something like this with recursion and how?
I want to be able to choose how many loops I want, for instance GenerateNumbers(x) where x is numbers of loops I have inside.

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);
        }
    }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

滿滿的愛 2024-10-28 10:27:45
#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);
}
#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);
}
恏ㄋ傷疤忘ㄋ疼 2024-10-28 10:27:45

像这样的东西吗?

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]);
    }
}

(注意:这是 C 代码,因为您在示例中使用了 printf;如果是 C++,则状态数组必须包装在像 这样的智能指针中C++0x 中的 std::auto_ptrstd::unique_ptr

请注意,您也可以通过迭代来模拟这种递归,请参阅例如 我的另一个答案

Something like this?

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]);
    }
}

(notice: this is C code, since you used printf in your example; if it were C++ the state array would have to be wrapped in a smart pointer like std::auto_ptr or std::unique_ptr in C++0x)

Notice that you can emulate this kind of recursion also with iteration, see for example this other answer of mine.

北方的巷 2024-10-28 10:27:45

这确实是可能的。如果 x 存在上限,则需要使用堆栈结构或至少使用数组。

It is indeed possible. You need to use a stack structure or at the very least an array if there is an upper bound on x.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文