嵌套循环的递归

时间:2013-03-26 04:32:46

标签: java algorithm recursion

有没有办法创建以下代码的递归函数?

for(int i=0; i<1000000; i++){
    for(int j=0; j<1000000; j++){
        for(int k=0; k<1000000; k++){
            //Do something using i,j and k
        }
    }
}

我需要它来组合每个可能的数字序列。例如:(0,0,0)(0,0,1)(0,1,0)

通过这个循环花了大约10个小时,所以我必须简化它,我认为递归函数可以做到。

由于

3 个答案:

答案 0 :(得分:3)

理论上,每个迭代循环都可以转换为递归调用(使用无限堆栈或通过tail-call),但是:

  1. 递归并不比迭代更快 - 时间复杂度相同
  2. Java不支持TCO,因此不支持如此深度的递归调用 - 数十个:是的,数百万:绝对不是
  3. 在这种情况下需要很长时间,因为循环次数。蛮力算法是O(n c ),其中c是3 - 即the bounds are polynomial time(这不好),n是“相对大”。那是很多 wasted CPU cycles

    考虑到这种许多排列通常无法直接使用/存储,但重新审视原始问题并在合理的时间内推导出一种方法可能会有所帮助复杂。例如,有一种更好的方法来计算排列。

答案 1 :(得分:0)

考虑以下事物递归,详细了解这一点。 Is recursion ever faster than looping?

因此,当您标记Java时,递归比迭代更昂贵,因为必须分配堆栈内存。因此,如果您打算记录这些排列,那么最好将它们存储到文件中供以后使用。这取决于你的问题陈述,可以为此指定更准确的答案。

答案 2 :(得分:0)

为什么将它转换为递归,这会让它运行得更慢..

但你可以试试这个:

public static void recursiveLoop (int i, int j, int k, int w, int h, int d)
{

    /* code .. */

    /* increment i,j,k */
    if (k == d)
    {
        k = 0;
        j++;
    }

    if (j == h)
    {
        j = 0;
        i++;
    }

    if (i == w)
    {
        return; // Stop
    }

    recursiveLoop(i,j,k);

}

但编译器会将其更改为:

public static void recursiveLoop (int i, int j, int k, int w, int h, int d)
{

    do
    {

        /* code .. */

        /* increment i,j,k */
        if (k == d)
        {
            k = 0;
            j++;
        }

        if (j == h)
        {
            j = 0;
            i++;
        }

    }while (i != w);

}