Превращение рекурсивной функции в цикл for в чистую рекурсию - PullRequest
0 голосов
/ 05 сентября 2018

Я сделал эту функцию для печати powerset в данном массиве, Я по своей сути построил функцию с циклом for в качестве основы, а затем преобразовал ее в чисто рекурсивный, но мне кажется, что я попал в тупик.

вот функция:

void powerSet(int* arr, int* p, int n, int pos, int index)
{
    if (index == n)
    {
        return;
    }
    for (int i = index; i<n; i++)
    {
        p[pos] = arr[i];

        for (int j = 0; j <= pos; j++)
            printf("%d ", p[j]);
        printf("\n");

        powerSet(arr, p, n, pos + 1, i + 1);
    }
}

UPDATE:

вот мой код, по какой-то причине он только печатает

1
1 2
1 2 3
1 2 3 4
1 2 3 4 5

сниппет:

void powerSet(int* arr, int* p, int n, int pos, int index)
{
    if (index == n)
    {
        return;
    }
    p[pos] = arr[index];
    PrintRec(0, pos, p);
    powerSet(arr, p, n, pos + 1, index + 1);
}
void getSubSet(int*arr, int*p, int n, int i, int end)
{
    if (i > end)
        return;
    powerSet(arr, p, n, i, end);
    getSubSet(arr, p, n, i + 1, end);
}
void PrintRec(int j, int end, int* p)
{
    if (j > end)
    {
        printf("\n");
        return;
    }
    printf("%d ", p[j]);
    PrintRec(j + 1, end, p);
}

основной:

int arr[] = { 1,2,3,4,5 };
int n = sizeof(arr) / sizeof(arr[0]);
int temp[5];
getSubSet(arr, temp, n, 0, 0);

РЕДАКТИРОВАТЬ: Опубликовал решение!

1 Ответ

0 голосов
/ 05 сентября 2018

Мне наконец удалось это выяснить, вот ответ для всех, кому небезразлично:

void main()
{
    int arr[] = { 1,2,3 };
    int n = sizeof(arr) / sizeof(arr[0]);
    int temp[4];
    powerSet(arr, temp, n, 0, 0);
}

void powerSet(int* arr, int* p, int n, int pos, int index)
{
    if (index >= n)
    {
        return;
    }
    p[pos] = arr[index];
    PrintRec(0, pos, p);
    powerSet(arr, p, n, pos + 1, index + 1);
    powerSet(arr, p, n, pos, index+1);

}
void PrintRec(int j, int end, int* p)
{
    if (j > end)
    {
        printf("\n");
        return;
    }
    printf("%d ", p[j]);
    PrintRec(j + 1, end, p);
}

выход:

1
1 2
1 2 3
1 3
2
2 3
3
...