详解递归算法以及非递归快速排序

我们可以把” 递归 “比喻成 “查字典 “,当你查一个词,发现这个词的解释中某个词仍然不懂,于是你开始查这第二个词。

int Factorial(int n){    

      if (n == 0)  return 1;  

      return

      n * Factorial(n - 1);

}

详解递归算法以及非递归快速排序_第1张图片

用函数factorial(n)可计算阶乘

factorial(5) = 5!
factorial(10) = 10!

5! = 12345 = 120

10! = 123456789*10 = 3628800

例如5!

>> factorial(5)

ans=120

如:组合数:choose(n,k) —— 从n个中选出k个

阶乘:factorial(k) —— k!

排列数:choose(n,k) * factorial(k)

“递归的过程就是出入栈的过程”,这句话怎么理解?我们以上述代码为例,取 n=3,则过程如下:

第 1~4 步,都是入栈过程,Factorial(3)调用了Factorial(2),Factorial(2)又接着调用Factorial(1),直到Factorial(0);

第 5 步,因 0 是递归结束条件,故不再入栈,此时栈高度为 4,即为我们平时所说的递归深度;

第 6~9 步,Factorial(0)做完,出栈,而Factorial(0)做完意味着Factorial(1)也做完,同样进行出栈,重复下去,直到所有的都出栈完毕,递归结束。

factorial函数的功能是实现N的阶乘,传进去的参数k,为参与阶乘的最大值,然后返回一个阶乘的结果;vs=factoria(K);就表示k的阶乘,然

后把结果赋给VS。

每一个递归程序都可以把它改写为非递归版本。我们只需利用栈,通过入栈和出栈两个操作就可以模拟递归的过程,二叉树的遍历无疑是这

方面的代表。

但是并不是每个递归程序都是那么容易被改写为非递归的。某些递归程序比较复杂,其入栈和出栈非常繁琐,给编码带来了很大难度,而且

易读性极差,所以条件允许的情况下,推荐使用递归。

递归满足两个条件:

1,不断调用函数本身,也就是递归函数。

2,调用是有限的,也就是递归出口。

非递归快速排序

package sort;

import java.util.Arrays;

public class TestQuickSort {
    
    public static int partion(int []array,int low,int hign){
        
            int tmp=array[low];
            while(low=tmp){
                    --hign;
                }
                if(low>=hign){
                    break;
                }else{
                    array[low]=array[hign];
                }
                while(low=hign){
                    break;
                }else{
                    array[hign]=array[low];
                }
            
        }
            array[low]=tmp;
            return low;
        
    }
    //快速排序的非递归用栈来做
    public static void QuickSort(int[]array){
        int[]stack=new int[array.length];
        int top=0;
        int low=0;
        int hign=array.length-1;
        int par=partion(array,low,hign);
        //入栈
        if(par>low+1){
            stack[top++]=low;
            stack[top++]=par-1;
        }
        if(par0){
            hign=stack[--top];
            low=stack[--top];
            par=partion(array,low,hign);
            if(par>low+1){
                stack[top++]=low;
                stack[top++]=par-1;
            }
            if(par

微信公众号“计算机基础学”关注我哟

你可能感兴趣的:(详解递归算法以及非递归快速排序)