Java 嵌套循环的递归

Java 嵌套循环的递归,java,algorithm,recursion,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 } } } for(int i=0;i理论上,每个迭代循环都可以转换为递归调用(使用无限堆栈或通过a),但是: 递归并不比迭代快

有没有办法创建一个递归函数的下面代码

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

for(int i=0;i理论上,每个迭代循环都可以转换为递归调用(使用无限堆栈或通过a),但是:

  • 递归并不比迭代快——时间复杂度是相同的
  • Java不支持,因此也不支持这种深度递归调用——几十个:是的,数百万个:绝对不支持
  • 在这种情况下,它需要很长的时间,因为循环次数太多了。蛮力算法是O(nc),其中c是3,也就是说,(这不好),n是“相对大的”。这是很多


    考虑到直接使用/存储这么多的排列通常是不明智的,重新审视原始问题并得出一种具有合理时间复杂性的方法可能是有益的。例如,有一种更好的方法来计算排列。

    考虑以下事情递归,详细讨论一下。


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

    为什么要将其转换为递归,这就是g让它跑得更慢

    但你可以试试这个:

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

    有办法吗?当然。我有理由吗?没有。你能详细解释一下为什么在这种情况下递归比迭代更好吗?另外,你在“j”for循环的结尾使用“I”。只是说。@Abu在理论上:是的。在实践中:这取决于。Java不支持TCO,所以递归在Java中的深度有限。递归没有改进在性能方面。这只是一种“更干净”的编写重复/循环指令的方式。我认为并行处理会是一个更好的主意。如果你有8个内核,你可以(在一个完美的世界中)将执行时间降低到10/8=1.25小时。
    “编译器将把它改成这样”
    -我强烈怀疑这一点。它们在功能上可能是相同的,但编译器不会将递归函数转换为迭代函数(至少在Java中不会)@Dukeling你是对的,我对大多数都不确定,但我知道将尾部递归转换为while循环是一种常见的编译器语法优化,不太可能的是模尾部递归优化请注意Java/JVM不支持尾部调用优化。还请注意,由于检查在最后,它将很可能是
    do{…}while();
    ,而不是
    while(){…}
    @Dukeling 1.(“挂钟”的时间对于特定的n可能不同)2.当然,只可能在一个维度中递归。哦,对了,复杂性。更新的注释-1)时间复杂性可能是相同的,但在Java中,递归通常比较慢(简单地提到它),虽然只有一个很小的常数因子,但鉴于给定代码的简单性,它可能会产生很大的不同。2) 我想的方法只需要递归深度为3,而不是数百万。不知道你还想怎么做。