递归

递归是函数调用自身的一种特殊的编程技术,其应用主要在以下几个方面:

1、阶乘

在 java 当中的基本形式是:

Public void mothed(int n){//当满足某条件时:
   Mothed(n‐1);
}

2、递归二分查找

Java 二分查找实现,欢迎大家提出交流意见

/**
 *名称:BinarySearch
 *功能:实现了折半查找(二分查找)的递归和非递归算法.
 *说明:
 * 1、要求所查找的数组已有序,并且其中元素已实现 Comparable<T>接口,如Integer、String 等.
 * 2、非递归查找使用 search();,递归查找使用 searchRecursively();
 *
 *本程序仅供编程学习参考
 *
 *@author: iwen
 *@date: 2018-8-11
 *@email: 
 */
class BinarySearch<T extends Comparable<T>> {
    private T[] data;//要排序的数据
    public BinarySearch(T[] data){
        this.data = data;
    }
    public int search(T key){
        int low;
        int high;
        int mid;
        if(data == null)
            return -1;
        low = 0;
        high = data.length - 1;
        while(low <= high){
            mid = (low + high) / 2;
            System.out.println("mid " + mid + " mid value:" + data[mid]);///

            if(key.compareTo(data[mid]) < 0){
                high = mid - 1;
            }else if(key.compareTo(data[mid]) > 0){
                low = mid + 1;
            }else if(key.compareTo(data[mid]) == 0){
                return mid;
            }
        }
        return -1;
    }
    private int doSearchRecursively(int low , int high , T key){
        int mid;
        int result;
        if(low <= high){
            mid = (low + high) / 2;
            result = key.compareTo(data[mid]);
            System.out.println("mid " + mid + " mid value:" + data[mid]);///

            if(result < 0){
                return doSearchRecursively(low , mid - 1 , key);
            }else if(result > 0){
                return doSearchRecursively(mid + 1 , high , key);
            }else if(result == 0){
                return mid;
            }
        }
        return -1;
    }
    public int searchRecursively(T key){
        if(data ==null)return -1;
        return doSearchRecursively(0 , data.length - 1 , key);
    }
    public static void main(String[] args){
        Integer[] data = {1 ,4 ,5 ,8 ,15 ,33 ,48 ,77 ,96};
        BinarySearch<Integer> binSearch = new BinarySearch<Integer>(data);
        //System.out.println("Key index:" + binSearch.search(33) );
        System.out.println("Key index:" + binSearch.searchRecursively(3) );
        //String [] dataStr = {"A" ,"C" ,"F" ,"J" ,"L" ,"N" ,"T"};
        //BinarySearch<String> binSearch = new BinarySearch<String>(dataStr);
        //System.out.println("Key index:" + binSearch.search("A") );
    }
} 

3、递归排序

其实在数组的全排序中完全可以使用更加易懂简便的写法——for 循环,但是通过 for 循环编写数组全排序需要有一个先决条件——知道数组全排序的个数,因为有 n 个数据全排序就需要写 n 个嵌套 for 循环。因此在写全排序时一般使用递归方 法。这就是我的第一个关于递归排序的见解——递归排序可以无需已知排序数组 的长度,即排序个数! 其二,不管是使用递归进行数组排序还是使用 for 循环进行数组的排序,它们都 是本质都是使用枚举,因此可以得出这样一个结论:枚举可以确保找出每一种可能 的排序规则! 其三,枚举是列出所有的方法并找出符合要求的算法,因此其算法效率一定比较 的低,需要对其进行优化,才能达到较好的效果(递归的时候排除所有不可能的 方案)

4、消除递归

消除递归的基本思路是用栈来模拟系统的函数调用从而消除递归。 基本上要做一下三件事:传递参数(包括返回地址)并转到函数入口;获得参数 并处理参数;根据传入的返回地址返回

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值