将迭代函数转换为递归

时间:2020-08-23 05:13:09

标签: c

如何将该迭代函数转换为递归? 有问题的函数在给定距离的情况下查找数组中的任何对。顺便说一下,这是C语言

int * findPair(int * array, int size, int distance)
{
    int * result = (int*)malloc(sizeof(int)*3);
    result[0] = 0;
    result[1] = 0;
    result[2] = 0;

    for (int i = 0; i < size; i++)
    {
        for (int j = 1; j < size; j++)
        {
            int diff = array[i] - array[j];

            if (diff == distance) // found a pair
            {
                result[0] = 1;
                result[1] = array[i];
                result[2] = array[j];
                break;
            }
        }
    }

    return result;
}

2 个答案:

答案 0 :(得分:1)

开始于:

将迭代方法转换为递归方法很少是一个好主意。您几乎总是应该选择迭代而不是递归。换句话说:仅当递归给您带来其他方面难以实现的东西时,才使用递归。

反正...

有很多方法可以使用递归来实现您想要的。

下面只是一个例子。 但是,我故意只删除了内部循环。代码应为您提供有关该原理的想法,然后(作为练习)您可以自己删除剩余的循环,以便获得“纯递归”没有任何for循环的方法。

void findPair_rec(int num, int * array, int size, int distance, int* res)
{
    assert(*res == 0);
    if (size == 0) return;  // Reach the end - no match - just return
    if ((num - *array) == distance)
    {
        // Match found - update result and return
        res[0] = 1;
        res[1] = num;
        res[2] = *array;
        return;
    }
    
    // Recursion - advance array pointer and decrement size
    findPair_rec(num, array + 1, size - 1, distance, res);
}

int * findPair(int * array, int size, int distance)
{
    int * result = calloc(3, sizeof *result);

    for (int i = 0; i < size && result[0] == 0; i++)
    {
        findPair_rec(array[i], array, size, distance, result);
    }

    return result;
}

答案 1 :(得分:1)

我喜欢递归。

要递归地解决该问题,请将其最小化为0大小的数组或1大小的数组...,然后从中减少到(n-1)大小的数组

df.to_csv("blah.txt", index=False)

请参见https://ideone.com/VuKWtl