【问题标题】:How recursion works [duplicate]递归如何工作[重复]
【发布时间】:2014-04-17 19:10:58
【问题描述】:
static void sort(int array[])
{
    //int array[]={20,40,30,60,70,80,50,90};
    if(array.length==1)
        return;

    int mid=array.length / 2;
    int part1[]=new int[mid];
    int part2[]=new int[array.length-mid];

    for(int i=0; i<array.length; i++)
    {
        if(i<mid)
        {
            part1[i]=array[i];
        }
        else
        {
            part2[i-mid]=array[i];
        }
    }

    sort(part1);
    sort(part2);

    merge(part1,part2,array);
    //for(int x=0; x<part1.length; x++)
        //System.out.print(part1[x]+" ");

    //for(int x=0; x<part2.length; x++)
        //System.out.print(part2[x]+" ");

}

我知道递归是自称的方法(函数)。 我在这段代码中感到困惑,为什么该程序停止,当 sort() 方法执行并调用自身 sort(part1) 方法然后 sort(part1) 一次又一次执行以及 sort(part2) 和 merge(part1,part2,array ) 被执行,为什么这段代码不是无限的以及程序如何停止。 抱歉,我是 Java 新手

【问题讨论】:

  • 使用调试器一步一步完成代码。
  • 当array.length==1 则停止执行
  • if(array.length==1) return; 是什么让你的代码停止。您是否尝试过在 StackOveflow 上查找有关递归的其他问题?
  • 尝试查找此评论末尾的问题,因为它对该主题有更详细的解释,这将有助于您更好地理解递归。您的代码类似于 jkohlhepp 的答案,更容易理解。 stackoverflow.com/questions/3021/…
  • @Coeur 关于递归的问题不需要“消除其他语言的歧义”。答案对所有人都是一样的。这篇有 5.75 年历史的帖子根本不需要任何编辑。不要进行琐碎的修改。

标签: java recursion


【解决方案1】:

每个递归调用都在一半大小的段上工作:

int mid=array.length / 2;

当子段长度达到1时,递归处于“基本情况”,方法返回:

if(array.length==1)
    return;

我认为这实际上是 Quicksort 的实现。该算法属于称为 Divide and Conquer 的算法家族,因为它们通过递归地将问题分成越来越小的部分,解决较小的问题,最后结合较小的解决方案来获得完整的结果。

既然您知道该算法的名称,如果您想更好地了解它的工作原理,我建议您更详细地研究该算法。维基百科的文章甚至有一个很好的动画来帮助你想象算法是如何工作的。


请注意,发布的代码导致空数组的无限递归。 Quicksort 避免这种情况的常用方法是使用 length ≤ 1 而不是 length = 1 检查基本情况。

【讨论】:

    【解决方案2】:

    它停止了,因为 part1 和 part2 是 小于 数组比原来的数组。最后它们只是 1 元素数组,所以

    if(array.length==1)
        return;
    

    火灾。一般来说,这里有一个循环函数,形式为

      T(n)     =    T(n/2)     +    T(n/2)       + O(n) 
      ----          ------          ------         ---
    sort(part)     sort(part1)     sort(part2)     merge
    
    T(1) = 1 # 
    

    【讨论】:

      【解决方案3】:

      在每次递归调用中,您将数组分成 2 个新的半大小数组。您的基本条件是,如果数组的大小为 1,则返回。这就是您的程序停止的地方,因为数组的最终大小将为 1 。

      【讨论】:

        【解决方案4】:

        每次调用sort 方法时,它会将当前方法调用保存在堆栈中,并将新调用推送到sort。因此,在该方法调用结束时,前一个对 sort 的调用被执行,并一直持续到堆栈为空,或者对 sort 的第一次调用返回。

        https://softwareengineering.stackexchange.com/questions/25052/in-plain-english-what-is-recursion

        上面的例子非常详细地解释了递归。

        【讨论】:

          猜你喜欢
          • 2013-10-28
          • 2018-08-10
          • 1970-01-01
          • 1970-01-01
          • 2019-06-10
          • 1970-01-01
          • 2022-11-26
          • 2017-01-18
          • 2011-07-13
          相关资源
          最近更新 更多