2017-02-27 122 views
0

我看到一些帖子,了解归并排序。我知道递归方法维护堆栈来保存值。 (我明白的是return语句的结果将是在栈)了解递归与归并排序

private int recur(int count) { 
    if (count > 0) { 
     System.out.println(count); 
     return count + recur(--count); // this value will be in stack. 
    } 
    return count; 
} 

我困惑的合并排序如何堆在这里维护。

private void divide(int low, int high) { 
    System.out.println("Divide => Low: "+ low +" High: "+ high); 
    if (low < high) { 
     int middle = (low + high)/2; 
     divide(low, middle); // {0,7},{0,3}, {0,1} ; 
     divide(middle + 1, high); // {0,0}; high = 1; // 2nd divide 
     combine(low, middle, high); 
    } 
} 
  1. 是堆栈的所有局部变量?
  2. 当第二次递归方法调用时,第一次递归也会加入? 在这种情况下如何维护堆栈?
+0

[这](https://www.youtube.com/watch?v=zkdwpdHLuII)最能解释它。 –

+0

你会更简单地理解递归问题。甚至在此之前,您应该查看堆栈是什么,调用函数以及将哪些值压入堆栈,如何将返回值传播给调用方以及如何将参数传递给函数。 –

回答

0

你只需要知道一个语句需要完成并返回,你从divide调用dividecombine的工作原理相同。两者都需要在可以执行下一行代码之前完成,或者如果没有更多行,则函数返回。是的,它是用堆栈完成的,但它并不重要。

  1. 侍应生变量lowhighmiddle的状态仅在当前调用映射,所以他们没有得到与其他调用混合。

  2. 每次巢新调用它得到它自己的变量,每个人都需要完成。当中低音结束时,它会调用中音+ 1高音,并在中音结束时结束。这些调用将执行相同的操作,因此您将拥有更深的嵌套以及调用结构将如何访问,就像二叉树结构,叶子是low == high(一个元素)。

一句忠告。在查看递归代码时,尝试从叶到更复杂的树。例如。先试用基本案例,然后再选择最简单的默认案例。例如。

  1. 1元件阵列:什么也不做
  2. 2元件阵列: - > 1门元件阵列(参照1),1个元件阵列,结合
  3. 4元件阵列: - > 2元件阵列(见第2 ),2元素数组,合并

请注意,2.你知道这两个递归调用不会做任何事情,combine也许会做一个交换。 3.在combine之前做两次(包括交换),这将合并排序的2 2个元素数组。你可能以另一种方式看待它,这就要求你暂停3.做2.停止它并做1.,然后下一个1,然后回到2.做两个1的文本......它需要笔和纸。用叶子到根的角度来看,使用迄今为止所学到的知识可以让你更容易理解它。我认为功能递归比改变像合并排序这样的结构更容易掌握。例如。斐波纳契序列。