递归如何工作

时间:2014-03-13 07:38:18

标签: java recursion

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新手

4 个答案:

答案 0 :(得分:4)

每个递归调用都适用于与父调用一半大的段:

int mid=array.length / 2;

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

if(array.length==1)
    return;

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

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


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

答案 1 :(得分:3)

它会停止,因为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 # 

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

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

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